Mapreduce 如何执行具有多个映射函数的riak mapred查询

Mapreduce 如何执行具有多个映射函数的riak mapred查询,mapreduce,riak,Mapreduce,Riak,我想在erlang中执行一个mapreduce查询,该查询包含两个映射阶段,以便Map2函数将Map1函数的结果作为输入。是否可能,如果可能,每个映射阶段的返回值必须是什么 有关详细信息: 我使用两个简单的映射函数运行了一个testmapred查询,每个函数返回输入对象(在列表中)。但是通过运行查询,我得到了一个不匹配错误 Map1 = fun(O,_,_) -> [O] end. Map2 = fun(O, _,_) -> [O] end. C:mapred_bucket(

我想在erlang中执行一个mapreduce查询,该查询包含两个映射阶段,以便Map2函数将Map1函数的结果作为输入。是否可能,如果可能,每个映射阶段的返回值必须是什么

  • 有关详细信息:
我使用两个简单的映射函数运行了一个testmapred查询,每个函数返回输入对象(在列表中)。但是通过运行查询,我得到了一个不匹配错误

Map1 = fun(O,_,_) -> [O] end.
Map2 = fun(O, _,_) -> [O] end.


C:mapred_bucket(<<"b7bc1418-198d-44a3-8835-8aa9cb416d5b">>, [{map, {qfun, Map1}, none, false}, {map, {qfun, Map2}, none, true}]).

{{badmatch,{r_object,<<"b7bc1418-198d-44a3-8835-8aa9cb416d5b">>,
                     <<255,230,193,167,254,7,246,64,154,190,36,236,32,232,189,
                       169,161,124,23,86>>,
                     [{r_content,{dict,2,16,16,8,80,48,
                                       {[],[],[],[],[],[],[],[],[],[],[],...},
                                       {{[],[],[],[],[],[],[],[],[],...}}},
                                 <<"12d33872-4c92-4da5-9d16-5036a8059253">>}],
                     [{<<5,215,86,61>>,{1,63487018636}}],
                     {dict,1,16,16,8,80,48,
                           {[],[],[],[],[],[],[],[],[],[],[],[],...},
                           {{[],[],[],[],[],[],[],[],[],[],...}}},
                     undefined}},
 [{riak_kv_map_phase,build_input,2},
  {riak_kv_map_phase,'-handle_input/3-lc$^0/1-0-',2},
  {riak_kv_map_phase,handle_input,3},
  {luke_phase,executing,2},
  {gen_fsm,handle_msg,7},
  {proc_lib,init_p_do_apply,3}]}
Map1=fun(O,,,)->[O]结束。
Map2=fun(O,_,_)->[O]结束。
C:mapred_bucket(,[{map,{qfun,Map1},none,false},{map,{qfun,Map2},none,true}])。
{{badmatch,{r_对象,,
,
[{r_内容,{dict,2,16,16,8,80,48,
{[],[],[],[],[],[],[],[],[],[],[],...},
{{[],[],[],[],[],[],[],[],[],...}}},
}],
[{,{1,63487018636}}],
{dict,1,16,16,8,80,48,
{[],[],[],[],[],[],[],[],[],[],[],[],...},
{{[],[],[],[],[],[],[],[],[],[],...}}},
未定义的}},
[{riak_kv_map_相位,构建输入,2},
{riak_kv_map_phase'-handle_input/3-lc$^0/1-0-',2},
{riak_kv_map_相位,处理输入,3},
{luke_阶段,执行,2},
{gen_fsm,handle_msg,7},
{proc_lib,init_p_do_apply,3}]}
我正在使用riak_搜索-0.14.2

Erlang R14B03(erts-5.8.4)


谢谢大家!

我不确定Map方法在Erlang中的签名是什么,因为我只在Javascript中完成了Map/reduce,但我会尽力提供帮助

为了链接映射阶段,只有最后一个映射函数需要返回Riak中的对象列表。上面的其他映射函数都需要返回一个元组,其中包含bucket名称和传入值的键

在Javascript中,我是这样完成的:

function map_function(value, keydata, arg) {
    //filtering stuff here
    if(arg.last) {
      data["key"] = value.key;
      return [data];
    }
    else {
      return [[value.bucket, value.key]];
    }
    //this is in the case the filter returns true; if the filter returns false, return an empty tuple
  }

希望这有帮助。

您必须从第一个映射函数返回{Bucket,Key}或{{Bucket,Key},KeyData}。
像这样:

Map1 = fun(O,_,_) -> [{riak_object:bucket(O), riak_object:key(O)}] end.
Map2 = fun(O, _,_) -> [O] end.


C:mapred_bucket(<<"b7bc1418-198d-44a3-8835-8aa9cb416d5b">>, [{map, {qfun, Map1}, none, false}, {map, {qfun, Map2}, none, true}]).
Map1=fun(O,u,u)->[{riak_对象:bucket(O),riak_对象:key(O)}]结束。
Map2=fun(O,_,_)->[O]结束。
C:mapred_bucket(,[{map,{qfun,Map1},none,false},{map,{qfun,Map2},none,true}])。