0

カスケードが初めてで、並べ替え/順序に基づいて上位 N 個のタプルを取得する方法を見つけようとしています。たとえば、人々が使用している名前の上位 100 位を知りたいとします。

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

これはhadoop pigで似ています

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;

SQL や Pig で実行するのは非常に簡単に思えますが、カスケードで実行する方法を見つけるのに苦労しています。お知らせ下さい!

4

2 に答える 2

1

方法 1 GroupBy を使用し、必要な列に基づいてそれらをグループ化し、カスケードによって提供される二次並べ替えを利用できます。デフォルトでは、それらを昇順で提供します。降順にしたい場合は、逆順で行うことができます()

TOP n タプルまたは行を取得するには

その非常に単純な方法は 、FILTER で静的変数カウントを使用し、タプル カウント値が 1 増加するたびにそれを 1 ずつ増やし、それが N より大きい天気をチェックすることです。

カウント値が N より大きい場合は true を返し、それ以外の場合は false を返します

これにより、出力に最初の N タプルが提供されます

方法 2

カスケードは、firstNbuffer を返す inbuit 関数 unique を提供します。

以下のリンクを参照してください http://docs.cascading.org/cascading/2.2/javadoc/cascading/pipe/assembly/Unique.html

于 2014-03-19T07:27:44.383 に答える
1

これを行う方法についてパイプをセットアップするだけでよいと仮定します。

カスケード 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)

InPipe は、上記で参照しているタプル データを保持する着信タップで形成されます。つまり、「first_name」です。が呼び出されると「num_records」が作成さnew Count()れます。

Tap「num_records」と「first_name」のデータが別々のタップ (テーブルまたはファイル) にある場合、これら 2 つのソースを指す 2 つのパイプを設定し、 CoGroup.

私が使用した定義は Cascading 2.1.6 のものです。

グループ化(String groupName, Pipe pipe, Fields groupFields, Fields sortFields, boolean reverseOrder)

カウント(Fields fieldDeclaration)

初め(Fields fieldDeclaration, int firstN)

于 2013-04-30T19:03:33.417 に答える