2

Map2 関数が Map1 関数の結果を入力として受け取るように、2 つのマップ フェーズを含む mapreduce クエリを erlang で実行したいと考えています。可能であれば、各マップフェーズの戻り値は何でなければなりませんか

  • 詳細については:

2 つの単純な map 関数を使用して mapred クエリのテストを実行しました。それぞれが入力オブジェクトを (リストで) 返します。しかし、クエリを実行すると、不適切な一致エラーが発生します

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}]}

私はriak_search-0.14.2を使用しています

Erlang R14B03 (erts-5.8.4)

ありがとう!

4

2 に答える 2

5

Map メソッドのシグニチャーが Erlang でどのようなものかはわかりません。私は Javascript でのみ map/reduce を行ったことがありますが、助けようとします。

map フェーズを連鎖させるために、最後の map 関数だけが Riak のオブジェクトのリストを返す必要があります。上記の他のすべてのマップ関数は、バケット名と渡された値のキーを含むタプルを返す必要があります。

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
  }

お役に立てれば。

于 2012-01-11T01:31:05.880 に答える
4

最初のマップ関数から{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}]).
于 2012-06-04T15:27:16.167 に答える