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}] 

所以对于上述数据,我必须在 erlang 中编写一个 reduce 阶段,它应该在与 python-riak 客户端一起使用时提供输出,如下所示:

{'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 的值每轮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函数,但我相信我们必须先拿map,这就是为什么:

“要理解的最重要的事情是,定义reduce阶段的函数可能会被多次评估,后期评估的输入将包括早期评估的输出。” [ http://docs.basho.com/riak/latest/dev/advanced/mapreduce/#MapReduce]

所以处理这个最简单的方法是让map的输出看起来和reduce的输出一样。所以首先让你的地图输出看起来像这样:

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

显然,这使得 reduce 阶段变得更加困难(欢迎使用 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 回答