6

ログファイルは次のようになります。

Time stamp,activity,-,User,-,id,-,data

--

2013-01-08T16:21:35.561+0100,reminder,-,User1234,-,131235467,-,-
2013-01-02T15:57:24.024+0100,order,-,User1234,-,-,-,{items:[{"prd":"131235467","count": 5, "amount": 11.6},{"prd": "13123545", "count": 1, "amount": 55.99}], oid: 5556}
2013-01-08T16:21:35.561+0100,login,-,User45687,-,143435467,-,-
2013-01-08T16:21:35.561+0100,reminder,-,User45687,-,143435467,-,-
2013-01-08T16:21:35.561+0100,order,-,User45687,-,-,-,{items:[{"prd":"1315467","count": 5, "amount": 11.6},{"prd": "133545", "count": 1, "amount": 55.99}], oid: 5556}
...
...

編集

このログの具体例:

User1234has got a reminder- this reminderhas id= 131235467, this after this he made an an orderwith following data:{items:[{"prd":"131235467","count": 5, "amount": 11.6},{"prd": "13123545", "count": 1, "amount": 55.99}], oid: 5556} この場合idprdofは同じなので、 * -> この場合は 5*11.6 = 58 をdata合計して、次のように出力しますcountamount

User 1234    Prdsum: 58    

User45687も作成しましたorderが、彼は受け取っていないのでreminder、彼の合計はありませんdata

出力:

User45687    Prdsum: 0

このログの最終出力:

User 1234    Prdsum: 58    
User45687    Prdsum: 0

私の質問は次のとおりです:この値を比較(?)するにはどうすればよいidですprddata? キーはユーザーです。カスタムの Writable は便利でしょうか -> value= (id, data)。アイデアが必要です。

4

2 に答える 2

0

1 つの Hadoop ジョブの最初のパスの結果として、生の出力合計を取得することをお勧めします。そのため、Hadoop ジョブの最後には、次のような結果が得られます。

User1234     Prdsum: 58    
User45687    Prdsum: 0

次に、さまざまな値を比較して別のレポートを生成する 2 番目の Hadoop ジョブ (またはスタンドアロン ジョブ) を作成します。

最初の Hadoop ジョブの一部として「状態」が必要ですか? その場合、比較するすべてのキー (この場合はユーザー) の値を格納するマッパーまたはリデューサーに HashMap または HashTable を保持する必要がありますが、それは適切な設定ではありません。ある Hadoop ジョブで集計を行い、別のジョブで比較を行う方がよいでしょう。

于 2013-03-11T17:40:49.177 に答える
0

実現する 1 つの方法は、複合キーを使用することです。Mapper出力キーはuserid、event idの組み合わせ(リマインダー→0、オーダー→1)。ユーザー ID を使用してデータを分割し、独自のコンパレータを作成する必要があります。ここに要点があります。

マッパー

for every event check the event type 
    if event type is "reminder"
        emit : <User1234,0> <reminder id>
    if event type is "order"
        split if you have multiple orders
        for every order
            emit : <User1234,1> <prd, count* amount, other interested blah>

同じユーザーを持つすべてのエントリが同じレデューサーに移動するように、ユーザー ID を使用して分割します。

レデューサー

レデューサーでは、すべてのエントリがユーザー ID と並べ替えられたイベント ID によってグループ化されます (つまり、最初に特定のユーザー ID のすべてのリマインダーが取得され、その後に注文が続きます)。

If `eventid` is 0
    add reminders id to a set (`reminderSet`).

If `eventid` is is 1 &&  prd is in `remindersSet` 
   emit : `<userid>  <prdsum>`
else 
   emit : `<userid>  <0>` 

複合キーの詳細については、「Hadoop 決定版ガイド」またはこちらを参照してください。

于 2013-06-11T16:41:51.927 に答える