0

私は2つの問題に直面しています:

  1. レポート ファイル

    PIG レポートを生成しています。その出力は、part-r-00000、part-r-00001 などの複数のファイルに出力されます (これは同じ関係から生じます。複数のマッパーがデータを生成しているだけです。したがって、複数のファイルが存在します。):

    B = FOREACH A GENERATE col1,col2,col3;
    STORE B INTO $output USING PigStorage(',');
    

    これらすべてを 1 つのレポートにまとめたいので、 を使用して結果を保存する前に、HBaseStorage並列 1: を使用して並べ替えますreport = ORDER report BY col1 PARALLEL1。つまり、レデューサーの数を 1 に強制しているため、次のように単一のファイルを生成しています。

    B = FOREACH A GENERATE col1,col2,col3;
    B = ORDER B BY col1 PARALLEL 1;
    STORE B INTO $output USING PigStorage(',');
    

    単一のファイル出力を生成するより良い方法はありますか?

  2. グループ化

    group-by を実行するレポートがいくつかあります。grouped = GROUP data BY col言及しない限りparallel 1、PIG は結果をグループ化するために複数のレデューサーを使用することがあります。データを合計またはカウントすると、間違った結果が得られます。例えば:

    これを見る代わりに:

    part-r-00000:
    grouped_col_val_1, 5, 6
    grouped_col_val_2, 1, 1
    
    part-r-00001:
    grouped_col_val_1, 3, 4
    grouped_col_val_2, 5, 5
    

    私が見ているは​​ずです:

    part-r-00000:
    grouped_col_val_1, 8, 10
    grouped_col_val_2, 6, 6
    

    したがって、次のようにグループを実行することになります。grouped = GROUP data BY col PARALLEL 1 その後、正しい結果が表示されます。

    何かが足りない気がします。

    これは、グループ化を行う方法の疑似コードです。

    raw = LOAD '$path' USING PigStorage...
    row = FOREACH raw GENERATE id, val
    grouped = GROUP row BY id;
    report = FOREACH grouped GENERATE group as id, SUM(val)
    STORE report INTO '$outpath' USING PigStorage...
    
4

1 に答える 1

1

編集、提供した追加の詳細に基づく新しい回答:

1)いいえ、あなたがそれを説明する方法は、Pigでそれを行う唯一の方法です. (ソートされた)ファイルをダウンロードしたい場合は、hdfs dfs -catまたはを実行するのと同じくらい簡単hdfs dfs -getmergeです。ただし、HBase の-loadKey=true場合、HBaseStorage のオプションを使用する場合、余分な並べ替えを行う必要はありません。私はこれを試していませんが、試してみて、うまくいくかどうか教えてください。

2)PARALLEL 1は必要ありません。これが機能しない場合は、疑似コードが不完全であると思われます。カスタムパーティショナーを使用していますか? GROUP BYによって使用されるデフォルトのパーティショナーは、キーのすべてのインスタンスを同じリデューサーに送信するため、期待する結果が得られるため、それが結果に対して私が見つけることができる唯一の説明です。

古い答え:

1) レデューサーを 1 つだけ使用する代わりに、マージ結合を使用できます。Apache Pig のドキュメントから:

多くの場合、ユーザー データは、両方の入力が既に結合キーで並べ替えられているように保存されます。この場合、MapReduce ジョブの map フェーズでデータを結合することができます。これにより、不要なソートおよびシャッフル フェーズを介してすべてのデータを渡す場合に比べて、パフォーマンスが大幅に向上します。

これを行う方法は次のとおりです。

C = JOIN A BY a1, B BY b1, C BY c1 USING 'merge';

PARALLEL 12)目的の結果を得るために使用する必要はありません。GROUP使用しているレデューサーの数に関係なく、正常に動作するはずです。ケース 2 で使用するスクリプトのコードを投稿していただけますか?

于 2013-10-03T19:07:16.970 に答える