【问题标题】:Error while doing Mapreduce in riak-erlang client在 riak-erlang 客户端中执行 Mapreduce 时出错
【发布时间】:2014-07-05 21:54:15
【问题描述】:

我已经完成了以下操作。我已经存储了如下详细信息,但是即使我在 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"...>>}

我做错了什么,我无法弄清楚。请

【问题讨论】:

  • 部分错误丢失,因为 Erlang 正在截断它;查看完整的错误可能会有所帮助。尝试打印结果(请参阅gist.github.com/macintux/0e0222348263799ffb81),它可能会为您提供更多有用的信息,或者至少可以帮助其他人解决它。

标签: erlang riak erlang-shell


【解决方案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.

您存储的值是二进制文件&lt;&lt;"gopi &amp; 1"&gt;&gt;,这是调用binary_to_term 时返回的值。然后列表理解实际上是[{I,1}|| I &lt;- &lt;&lt;"gopi &amp; 1"&gt;&gt;],这将引发 bad_generator 错误。为了使用这个 map 函数,所有的值都需要是 Erlang 列表。

【讨论】:

  • 我写了一个 reduce 函数,它从 map 阶段获取列表,比如 fun(Litst,_) -> ....end。它只会给出 list.so 我怎么能像 {ok,[0,R]} 那样为它分配右侧的值,或者只是得到列表,所以我可以给出 [R] = riakc_pb_socket:mapred(etc.. .
  • map 和 reduce 函数都返回一个列表。 riak_pb_socket:mapred 返回一个 ok 的元组和一个 Keep 为真的阶段列表,每个阶段是阶段索引(从 0 开始)和结果列表的元组。 {ok, [{0,R}]} = riakc_pb_socket:mapred( ... 应该在R 中为您提供结果,如果您只将 Keep 设置为单个阶段的 true。
猜你喜欢
  • 2011-03-06
  • 1970-01-01
  • 2013-04-03
  • 2015-01-02
  • 2017-04-02
  • 2014-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多