/ / hadoop kaskadowe, jak zdobyć najlepsze N ​​krotek - hadoop, mapreduce, sql-order-by, kaskadowe

hadoop kaskadowy jak zdobyć najlepsze N ​​krotek - hadoop, mapreduce, sql-order-by, kaskadowy

Nowy w kaskadowaniu, próbujący znaleźć sposób na zdobycie Top N krotek na podstawie sortowania / kolejności. na przykład chciałbym poznać 100 pierwszych imion, których używają ludzie.

oto co mogę zrobić podobnie w teradata sql:

select top 100 first_name, num_records
from
(select first_name, count(1) as num_records
from table_1
group by first_name) a
order by num_records DESC

Tutaj jest podobnie u świni hadoop

a = load "table_1" as (first_name:chararray, last_name:chararray);
b = foreach (group a by first_name) generate group as first_name, COUNT(a) as num_records;
c = order b by num_records DESC;
d = limit c 100;

Wydaje się to bardzo łatwe w SQL lub Pig, ale trudno jest znaleźć sposób na kaskadowanie. Proszę doradź!

Odpowiedzi:

1 dla odpowiedzi № 1

Zakładając, że potrzebujesz po prostu skonfigurować rurkę, jak to zrobić:

W kaskadzie 2.1.6

Pipe firstNamePipe = new GroupBy("topFirstNames", InPipe,
new Fields("first_name"),
);

firstNamePipe = new Every(firstNamePipe, new Fields("first_name"),
new Count("num_records"), Fields.All);

firstNamePipe = new GroupBy(firstNamePipe,
new Fields("first_name"),
new Fields("num_records"),
true); //where true is descending order

firstNamePipe = new Every(firstNamePipe, new Fields("first_name", "num_records")
new First(Fields.Args, 100), Fields.All)

Gdzie tworzona jest InPipe za pomocą przychodzącego kranu zawierającego dane krotki, o których mowa powyżej. Mianowicie „imię”. „Num_records” jest tworzone, gdy new Count() jest nazywany.

Jeśli masz dane „num_records” i „first_name” w osobnych dotknięciach (tabele lub pliki), możesz skonfigurować dwa potoki, które wskazują te dwa Tap źródła i dołącz do nich za pomocą CoGroup.

Użyłem definicji, które pochodzą z Cascading 2.1.6:

Grupuj według(String groupName, Pipe pipe, Fields groupFields, Fields sortFields, boolean reverseOrder)

Liczyć(Fields fieldDeclaration)

Pierwszy(Fields fieldDeclaration, int firstN)


1 dla odpowiedzi nr 2

Metoda 1 Użyj GroupBy i zgrupuj je na podstawie kolumnwymagane, a można skorzystać z wtórnego sortowania zapewnianego przez kaskadowanie, domyślnie jest to sprawdzane w kolejności rosnącej, jeśli chcemy, aby były sortowane w kolejności malejącej, możemy to zrobić odwrotnie ()

Aby uzyskać TOP n krotek lub rzędów

To dość proste wystarczy użyć zmienna statyczna policz w FILTRA i zwiększaj ją o 1 dla każdej wartości krotki wzrasta o 1 i sprawdź, czy jest większa niż N

zwraca true, gdy wartość zliczenia jest większa niż N, albo zwraca false

zapewni to wyjście z pierwszych N krotek

metoda 2

kaskadowanie zapewnia unikalną funkcję inbuit, która zwraca firstNbuffer

patrz poniższy link http://docs.cascading.org/cascading/2.2/javadoc/cascading/pipe/assembly/Unique.html