Erlang MapReduce on Riak database giving exception

别等时光非礼了梦想. 提交于 2019-12-11 03:14:23

问题


I am going through the tutorials of riak and Erlang, I have stored data in riak by the riak-erlang-client and i did the following:

1> {ok,Pid} = riakc_pb_socket:start_link("127.0.0.1", 8087).
{ok,<0.34.0>} 
2> Val1 = [1,2,3]. 
[1,2,3]
3> MyBucket = <<"numbers">>.
<<"numbers">>
4> Obj1 = riakc_obj:new(MyBucket,<<"ott">>,Val1).
5> riakc_pb_socket:put(Pid,Obj1).
ok
6> {ok, Fetched} = riakc_pb_socket:get(Pid,MyBucket,<<"ott">>).
{ok,{riakc_obj,<<"numbers">>,<<"ott">>,
           <<107,206,97,96,96,96,204,96,202,5,82,28,202,156,255,126,
             6,251,159,184,148,193,148,...>>,
           [{{dict,3,16,16,8,80,48,
                   {[],[],[],[],[],[],[],[],[],[],[],[],...},
                   {{[],[],[],[],[],[],[],[],[],[],...}}},
             <<131,107,0,3,1,2,3>>}],
           undefined,undefined}}
7> Val1 == binary_to_term(riakc_obj:get_value(Fetched)).
true
8> binary_to_term(riakc_obj:get_value(Fetched)).        
[1,2,3]

Now everything was fine , i want to extract the values from the list [1,2,3] that where only divisible by 2 from a mapreduce through erlang.

for that i have done the following,

9>Res = fun(Fetched,none)-> [X || X <- binary_to_term(riakc_obj:get_value(Fetched)), X rem 2 == 0] end.

I don't know exactly about what should write in the function parameters,as i am new to erlang and riak, so please correct me if am wrong.

Now when i going for mapreduce i have written this,

10>{ok , [{X}]} = riakc_pb_socket:mapred(Pid,[{<<"numbers">>,<<"ott">>}],[{map,{qfun,Res},none,true}]).

It was throwing the below exception..please suggest me a good way to understand what's going on and how to run mapreduce.

** exception exit: {noproc,{gen_server,call,
                                   [<0.34.0>,
                                    {req,{rpbmapredreq,<<131,108,0,0,0,3,104,2,100,0,6,105,
                                                         110,112,117,116,115,108,...>>,
                                                       <<"application/x-erlang-binary">>},
                                         60100,
                                         {132578423,<0.49.0>}},
                                    infinity]}}
 in function  gen_server:call/3 (gen_server.erl, line 188)
 in call from riakc_pb_socket:mapred/5 (src/riakc_pb_socket.erl, line 643)

Please,help me and suggest me, i hjave followed the links but i am not getting clearly that how to write on my own for a mapreduce so please guide me..it will help me.


回答1:


You are getting the noproc error because you are passing an arity-2 function. The map phase function should be arity-3. Also, specifying none in the function header will cause that clause to only be executed when the corresponding argument explicitly matches, use _ in place of arguments you don't care about, like:

Res = fun(Fetched,_,_)-> [X || X <- binary_to_term(riakc_obj:get_value(Fetched)), X rem 2 == 0] end.


来源:https://stackoverflow.com/questions/23612059/erlang-mapreduce-on-riak-database-giving-exception

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!