Ошибка при выполнении Mapreduce в клиенте riak-erlang

Я сделал следующее. Я сохранил детали, как показано ниже, но даже несмотря на то, что я получаю сообщение об ошибке в mapreduce, пожалуйста, помогите мне. Мне нужны данные корзины test_age. для отображения {гопи,1}.

1> {ok, Pid} = riakc_pb_socket:start_link('127.0.0.1',10017).
{ok,<0.34.0>}
2> Object = riakc_obj:new(<<"test_age">>, <<"test1">>, <<"gopi & 1">>). 
{riakc_obj,<<"test_age">>,<<"test1">>,undefined,[],
       undefined,<<"gopi & 1">>}
3> riakc_pb_socket:put(Pid,Object).
ok 
4> Mapf = fun(Obj,_,_) -> [{I,1}|| I <- binary_to_term(riak_object:get_value(Object))]   end. 
#Fun<erl_eval.18.82930912>
5> {ok, [{0,[R]}]} = riakc_pb_socket:mapred(Pid,<<"test_age">>,[{map,{qfun,Mapf},none,true}])
5> .
** exception error: no match of right hand side value {error,<<"{\"phase\":0,\"error\":\"function_clause\",\"input\":\"{ok,{r_object,<<\\\"test_age\\\">>,<<\\\"test1\\\">>,[{r_content,{dict"...>>}

где я делаю неправильно, что я не могу понять. пожалуйста


person Krish gopi    schedule 17.05.2014    source источник
comment
Часть ошибки отсутствует, потому что Erlang усекает ее; может быть полезно увидеть полную ошибку. Попробуйте распечатать результаты (см. gist.github.com/macintux/0e0222348263799ffb81), и это может дать вы больше полезной информации, или хотя бы помочь кому-то еще решить ее.   -  person macintux    schedule 18.05.2014


Ответы (1)


Проблема связана с вашей функцией карты:

Mapf = fun(Obj,_,_) -> [{I,1}|| I <- binary_to_term(riak_object:get_value(Object))] end.

Когда это выполняется, Obj будет содержать запись r_object, но Object будет неопределенной. Вероятно, вы хотели использовать:

Mapf = fun(Obj,_,_) -> [{I,1}|| I <- binary_to_term(riak_object:get_value(Obj))] end.

Значение, которое вы сохраняете, представляет собой двоичный файл <<"gopi & 1">>, который будет возвращен вызовом binary_to_term. В этом случае понимание списка эффективно [{I,1}|| I <- <<"gopi & 1">>], что вызовет ошибку bad_generator. Чтобы использовать эту функцию карты, все значения должны быть списками Erlang.

person Joe    schedule 19.05.2014
comment
Я написал функцию сокращения, которая берет список из фазы карты, например fun(Litst,_) -> ....end. он даст только list.so, как я могу присвоить ему правильное значение, например {ok, [0, R]}, или просто получить только список, чтобы я мог дать как [R] = riakc_pb_socket:mapred (и т. д. и т. д.. . - person Krish gopi; 21.05.2014
comment
обе функции map и reduce возвращают список. riak_pb_socket:mapred повторно настраивает кортеж ok и список фаз, для которых Keep было истинным, каждая фаза представляет собой кортеж индекса фазы (на основе 0) и списка результатов. {ok, [{0,R}]} = riakc_pb_socket:mapred( ... должен дать вам результат в R, если вы установите Keep на true только для одной фазы. - person Joe; 21.05.2014