2016-03-21 12 views
0

CTR(国別レベルでのクリック数に対するクリック数)、Iテーブル構造(インプレッションテーブルとクリックテーブル)、およびHadoop Pigでのコードを計算する必要があります。私の質問は、実装が最も効率的かどうか、より効率的な解決策があるかどうかです。ありがとう。Hadoop Pigでのクリック率計算

テーブルの印象:

impressionID、タイムスタンプ、countryID

クリックテーブル:

impressionID、タイムスタンプ

joined_feed = join impression by impressionID, click by impression ID; 
joined_feed = foreach joined_feed generate impression::countryID, click::impressionID is null? 0 : 1 as clicked; 
ctr_result = foreach (group joined_feed by country) generate group as countryID, SUM(clicked)/COUNT(joined_feed) 
+1

このようなコードでは、CTRを1にする必要があります。私が理解する限り、ここに参加する必要があります。さらに、クリックテーブルに国を持つことは素晴らしいことです。その後、クリック数とインプレッション数を別々に集計し、countryIDで結合することができます。これははるかに高速です。 – zuku

+1

結合のすべてのマップ/リダクションステージでは、シーケンス内の最後のテーブルがリデューサを介してストリーミングされ、他のテーブルはバッファされます。したがって、最大のテーブルがシーケンスの最後に表示されるようにテーブルを編成することによって、ジョイン・キーの特定の値の行をバッファリングするためにレデューサに必要なメモリを減らすのに役立ちます。 – Havnar

+0

@ zuku、良いキャッチ。左結合については、クリックなしのインプレッションが最終的な成果を記録してCTRを計算できることを確認することが正しいと思いますか? –

答えて

1

あなたはタイプを追加する必要がありますけれどもCTRを得るためにあなたの方法はかなり効果的ですキャストするか、0と1の束を得るでしょう

ctr_result = foreach (group joined_feed by country) generate group as countryID, (double) SUM(clicked)/(double) COUNT(joined_feed) as ctr 
+0

Alexeyさん、ありがとうございます。上記の@Havnarのようにテーブルの順序が重要であると思っていますか?ありがとう。 –

+1

@LinMaパフォーマンスを向上させたい場合(そしてテーブルをクリックすると十分に小さい場合) – Alexey

+0

Alexey、ありがとうございます。私は複製された結合を知っています。私の質問は、ブタの通常の参加についてです。テーブルの順序はパフォーマンスに関係しますか?上記のHavnarと私との間の議論を参照することができます。 :) –

関連する問題