2

我正在阅读 riak 和 Erlang 的教程,我已经通过 riak-erlang-client 将数据存储在 riak 中,并且我执行了以下操作:

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]

现在一切都很好,我想从列表 [1,2,3] 中提取值,这些值只能通过 erlang 的 mapreduce 被 2 整除。

为此,我做了以下事情,

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

我不知道应该在函数参数中写什么,因为我是 erlang 和 riak 的新手,所以如果有错误请纠正我。

现在,当我使用 mapreduce 时,我已经写了这个,

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

它引发了以下异常..请建议我一个了解正在发生的事情以及如何运行 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)

请帮助我并建议我,我已经按照链接进行操作,但我不清楚如何自己编写 mapreduce,所以请指导我..它会对我有所帮助。

4

1 回答 1

2

您收到 noproc 错误,因为您正在传递一个 arity-2 函数。地图阶段功能应该是arity-3。此外,none在函数头中指定将导致该子句仅在相应参数显式匹配时执行,用于_代替您不关心的参数,例如:

Res = fun(Fetched,_,_)-> [X || X <- binary_to_term(riakc_obj:get_value(Fetched)), X rem 2 == 0] end.
于 2014-05-12T15:55:32.213 回答