在riak-erlang客户端执行Mapreduce时出错



我做了以下事情。我已经存储了如下的细节,但即使我在mapreduce中得到错误,请帮助我。我想要test_age桶的数据。显示{gopi,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"...>>}

哪里我做错了,我不能弄清楚。请

问题是你的地图功能:

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列表。

最新更新