0

私は riak バケットにデータを持っています。python-riak クライアントを使用して以下のようなデータを取得しています。

<<"{\"META\": {\"campaign\": \"5IVUPHE42HP1NEYvKb7qSvpX2Cm\",
      \"createdat\": 1406978070.0,
      \"user_email\": \"gopikrishnajonnada@gmail.com\"},
\"mode\": 2,
\"status\": \"success\"}">>

上記のデータ形式は、すべてのキーに対して存在します。

そのため、python-riak クライアントを使用したマップ フェーズから、次のようなデータを取得しています。

[{'5IVUPHE42HP1NEYvKb7qSvpX2Cm': 1},
{'WL6iHLCgs492rFEFvqewzvCfFfj': 2},
{'5IVUPHE42HP1NEYvKb7qSvpX2Cm': 1}, 
{'5IVUPHE42HP1NEYvKb7qSvpX2Cm': 2}] 

したがって、上記のデータについては、以下のような python-riak クライアントで使用しているときに出力を提供する必要がある erlang で reduce フェーズを記述する必要があります。

{'5IVUPHE42HP1NEYvKb7qSvpX2Cm': {'ab_leads': 2, 'cp_leads': 1},
 'WL6iHLCgs492rFEFvqewzvCfFfj': {'ab_leads': 0, 'cp_leads': 1}}

したがって、マップ フェーズの [{key,Value}] のリストから、これに基づいて、{key ,Value} 値が 0 または 1 の場合、ab_leads のような新しい変数の特定のキーをインクリメントまたはカウントする必要があります。2 の場合、cp_leads のような新しい変数の特定のキーをカウントする必要があります。

したがって、リストの特定のキーについて、そのキーが 0 の場合は ab_leads を増やすか、2 の場合は cp_leads を増やす必要があります。

だから私は以下のように試してきましたが、これは私が望むように与えていません。また、前のリストの結果をキャッチする必要があり、riakがreduceフェーズがどのようにminの値を取るかを言うように、次の値のリストに追加する必要があります1ラウンドあたり20

lists:foldl(fun({Key,Mode},Acc) -> if Mode == 0;Mode == 1 -> orddict:update_counter({Key,<<"ab_leads">>},1,Acc); true -> orddict:update_counter({Key,<<"cp_leads">>},1,Acc) end end,orddict:new(),G).

上記のものはこのような結果を与えています

[{{<<"a">>,<<"ab_leads">>},2},{{<<"a">>,<<"cp_leads">>},1}]

だから私は上記のような結果が欲しいと言ったように上記を変換する必要があります

[{Key,{ab_leads:1,cp_leads:2}}]     
4

1 に答える 1

1

あなたの理解が正しければ、キャンペーンごとに 1 または 2 の「モード」を含む合計数のキーを取得しようとしています。

reduce 関数について質問されましたが、まずマップを取得する必要があると思います。その理由は次のとおりです。

「理解すべき最も重要なことは、reduce フェーズを定義する関数は複数回評価される可能性があり、後の評価の入力には以前の評価の出力が含まれることです。」[ http://docs.basho.com/riak/latest/dev/advanced/mapreduce/#MapReduce]

したがって、これを処理する最も簡単な方法は、map の出力を reduce の出力と同じに見せることです。したがって、最初に次のようなマップ出力を取得します。

[{'5IVUPHE42HP1NEYvKb7qSvpX2Cm': {'ab_leads': 1, 'cp_leads': 0}}, ...]

明らかに、これによりリデュース フェーズが少し難しくなり (map/reduce へようこそ)、これらの ab_leads と cp_leads がいたるところに渡されるため、タプルは当面は扱いやすくなる可能性があります。

[{'5IVUPHE42HP1NEYvKb7qSvpX2Cm': {1, 0}}, ...]

reduce は次のようになります。

lists:foldl(fun({Key,{Ab_leads, Cp_leads}}, Acc) -> 
    {Ab_leadsAcc, Cp_leadsAcc} = proplists:get_value(Key, Acc, {0, 0}),
    [ {Key, {Ab_leadsAcc + Ab_leads, Cp_leadsAcc + Cp_leads}} | proplists:delete(Key, Acc)]
end,
[],
G).

タプルによりreduce関数の作成がはるかに簡単になりましたが、将来の拡張性のためにキーを保持できることは明らかですが、reduceがproplistを処理できることを確認してください。必要に応じて orddics に戻ることもできますが、順序が重要でない場合は proplists の方が効率的です。

于 2014-08-06T09:21:01.457 に答える