1

私は apache pig が初めてで、pig スクリプトを記述してボトムアップ キューブを実装したいと考えています。ただし、これには階層的な方法でグループ化する必要があります。

たとえば、私のデータが (exchange,symbol,date,dividend) の形式で、配当がメジャーで、残りがディメンションである場合、最初にデータを exchange でグループ化し、総配当を出力し、次に exchange でさらにグループ化し、シンボルなど。

これを行う 1 つの方法は、グループごとの交換、グループごとのシンボル、グループごとの (交換、シンボル) など、可能なすべてのグループ化をスクリプトに記述することです。ただし、これは最適ではないようです。(たとえば)最初に交換ごとにグループ化し、次にすべての交換グループについて、シンボルごとに内部的にグループ化して(交換)の集約を生成し、次に(交換、シンボル)の集約を生成する方法はありますか?これはより効率的です。

ここで同様のことが議論されていますが、私の質問には答えませんでした: Pig LatinでネストされたFOREACHステートメントを使用してネストされたバッグを生成できますか? ありがとう!

4

1 に答える 1

1

これはすべて、「最適」の定義に依存します。最初に (交換、シンボル、配当) で詳細なグループ化を行い、次に (交換、シンボル) で取得するためにその結果をグループ化すると、(交換) で取得するその結果はある意味で正しいというあなたの直感算術演算を少なくすることができます。ただし、map-reduce フローは明らかに最適ではありません。これには 3 つの map-reduce ジョブが必要で、各出力が次の入力に供給されます。

各グループ化を個別に行う場合、必要な map-reduce ジョブは 1 つだけです。マッパーはグループ化ごとにキーと値のペアを発行し、リデューサーは各種類の集計を個別に処理します。map-reduce ジョブが 1 つあるということは、ディスクとの間で読み書きされるバイト数が減り、Hadoop ジョブの設定と破棄にかかる時間が短縮されることを意味します。また、非常に計算量の多いプロセスを実行している場合を除き (平均を計算することは絶対にありません)、これらの要因、特にディスク I/O は、ジョブにかかる時間を決定する上で最も重要な考慮事項です。

于 2013-06-08T13:35:26.247 に答える