我有一个 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}}]