1

私はヘルプに従いますalexeipabから豚の流出記憶を処理する方法、それは本当にうまくいきます、しかし私は今別の質問があります、同じサンプルコード:

pymt = LOAD 'pymt' USING PigStorage('|') AS ($pymt_schema);

pymt_grp_with_salt = GROUP pymt BY (key,salt)

results_with_salt = FOREACH pymt_grp {
    --distinct
    mid_set = FILTER pymt BY xxx=='abc';
    mid_set_result = DISTINCT mid_set.yyy;
    result = COUNT(mid_set_result)   
}

pymt_grp = GROUP results_with_salt BY key;

result = FOREACH pymt_grp {

   GENERATE SUM(results_with_salt.result); --it is WRONG!!
}

そのグループでは合計を使用できません。これは、塩なしで計算した結果とは大きく異なります。

解決策はありますか?最初にフィルタリングすると、多くのJOINジョブが発生し、パフォーマンスが低下します。

4

2 に答える 2

1

これを機能させるには、mid_set.yyyとsaltの間に多対1の関係が必要です。これにより、異なる行のmid_set.yyyの同じ値が、saltの同じ値にマップされます。そうでない場合、mid_set.yyyの値は、GROUP pymt BY(key、salt)によって生成されたさまざまなバッグに表示され、さまざまなソルトでDISTINCTを生き残るため、最終的なロールアップに複数回含まれます。そのため、saltとCOUNTofDISTINCTを使用すると間違った結果が得られる可能性があります。

簡単な方法は、saltをmid_set.yyy自体に置き換えるか、mid_set.yyyのハッシュを取得してsaltを計算し、modNを実行するUDF/ staticメソッドを作成することです。ここで、Nは1から無限大になります。素数。

于 2012-08-23T15:28:38.053 に答える
0

ありがとうalexeipab、あなたは私に大きな助けを与えてくれます、私が以下のように何をしますか

pymt = LOAD 'pymt' USING PigStorage('|') AS ($pymt_schema);

pymt = FOREACH pymt GENERATE *, (yyy%$prime_num) as salt;

pymt_grp_with_salt = GROUP pymt BY (key,salt);

できます!!

yyyがnum整数の場合、ハッシュを使用して文字列などを整数に変換できます

于 2012-08-24T06:20:19.903 に答える