Как написать функцию уменьшения фазы в эрланге в базе данных riak

У меня есть данные в Rakak Bucket Я получаю данные, как показано ниже, с помощью клиента 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, которая должна давать вывод при использовании с клиентом python-riak, как показано ниже:

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

поэтому из списка [{key,Value}] из фазы карты, основываясь на этом, я должен написать фазу карты для проверки условий, введя две новые переменные в результирующую фазу, как будто из списка фазы карты, если {ключ, Value} значение, имеющее 0 или 1, тогда мы должны увеличивать или считать эти конкретные ключи для новой переменной, такой как ab_leads, если она равна 2, тогда мы должны рассчитывать для этих конкретных ключей для новой переменной, такой как cp_leads.

Таким образом, для конкретного ключа из списка мне нужно сосчитать, если этот ключ имеет 0, тогда ab_leads нужно увеличить или если это 2, то cp_leads следует увеличить.

так что я пытался, как показано ниже, но это не дает, как я хочу, а также я должен поймать предыдущий список результатов и должен добавить к следующему списку значений, как то, что говорит риак, как фаза сокращения будет принимать значения мин 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}}]     

1 ответ

Решение

Если я вас правильно понимаю, вы пытаетесь получить общее количество ключей, которые содержат "режим" 1 или 2 для каждой кампании.

Хотя вы спрашивали о функции сокращения, я считаю, что сначала мы должны взять карту, и вот почему:

"Самая важная вещь для понимания - это то, что функция, определяющая фазу сокращения, может оцениваться несколько раз, и вход более поздних оценок будет включать в себя результат более ранних оценок". [ http://docs.basho.com/riak/latest/dev/advanced/mapreduce/

Таким образом, самый простой способ справиться с этим - сделать так, чтобы выходные данные карты выглядели так же, как выходные данные Reduce. Итак, сначала получите вывод вашей карты, похожий на этот:

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

Понятно, что это немного усложняет фазу сокращения (добро пожаловать в map / Reduce), и мы собираемся передавать эти ab_leads и cp_leads повсюду, и на данный момент кортеж может быть легче обрабатывать.

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

Наше сокращение теперь выглядит примерно так:

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).

Обратите внимание, что кортеж значительно облегчил создание функции сокращения, но, очевидно, вы можете сохранить ключи для расширения в будущем, но гарантируя, что ваше сокращение может обрабатывать список поддержки. Вы можете вернуться к орддиксам, если хотите, но проплисты более эффективны, когда порядок не имеет значения.

Другие вопросы по тегам