Карта Riak уменьшить в erlang, ошибка при попытке перечислить индекс / метаданные

Я пытаюсь использовать карту уменьшить в Риаке, чтобы сделать это:

  1. запросить все ключи в корзине X
  2. с индексом last_modify_int между 1 и 10
  3. сопоставить ключ и значение индекса tag_bin

в javascript карта будет

function(riakObject) {
          var indexes = riakObject.values[0].metadata.index;
          var tag_bin = indexes.tag_bin;

          return (tag_bin)? [
            [
              riakObject.key, tag_bin
            ]
          ] : [];
        }

но я не могу сделать это в JavaScript. Я храню данные не в формате json (двоичные) и не могу преобразовать их в JSON. и я не могу конвертировать в base64 или другие форматы.

Я решил использовать Erlang. но как я могу получить индекс 'tag_bin'?

Я пытаюсь адаптировать этот пример, чтобы перечислить все индексы / метаданные / и т.д. без успеха.

-module(mr_example).

-export([get_keys/3]).

% Returns bucket and key pairs from a map phase
get_keys(Value,_Keydata,_Arg) ->
  [{riak_object:bucket(Value), riak_object:index_data(Value) }].

Я храню данные в обучении сегментов, базе ключей и индексах last_modify_int => 3, tag_bin => 'even'

но это бросает одно исключение:

Error in 'map_reduce' : Riak Error (code: 0) '{"phase":0,"error":"undef","input":"{ok,{r_object,<<\"training\">>,<<\"baz\">>,[{r_content,{dict,4,16,16,8,80,48,{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},{{[],[],[],[],[],[],[],[],[],[],[[<<\"content-type\">>,112,108,97,105,110,47,116,101,120,116],[<<\"X-Riak-VTag\">>,53,100,98,54,69,79,103,103,70,75,70,48,85,105,50,110,73,78,57,101,101,69]],[[<<\"index\">>,{<<\"last_modify_int\">>,3},{<<\"tag_bin\">>,<<\"even\">>}]],[],[[<<\"X-Riak-Last-Modified\">>|{1386,780017,102696}]],[],[]}}},<<86,48,45,61,115,114,108,1,0,40,43,1,40,43,8,32,206,...>>}],...},...}","type":"error","stack":"[{riak_object,index_data,[{r_object,<<\"training\">>,<<\"baz\">>,[{r_content,{dict,4,16,16,8,80,48,{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},{{[],[],[],[],[],[],[],[],[],[],[[<<\"content-type\">>,112,108,97,105,110,47,116,101,120,116],[<<\"X-Riak-VTag\">>,53,100,98,54,69,79,103,103,70,75,70,48,85,105,50,110,73,78,57,101,101,69]],[[<<\"index\">>,{<<\"last_modify_int\">>,3},{<<\"tag_bin\">>,<<\"even\">>}]],[],[[<<\"X-Riak-Last-Modified\">>|{1386,780017,102696}]],[],[]}}},<<86,48,45,61,115,114,108,1,...>>}],...}],...},...]"}' at t/17_2i_map_reduce.t line 72.

Если я попробую эту функцию:

get_keys(Value,_Keydata,_Arg) ->
  [{riak_object:bucket(Value), riak_object:get_metadata(Value) }].

Ошибка:

Error in 'map_reduce' : Riak Error (code: 0) 'Error processing stream message: exit:{json_encode,
                                       {bad_term,
                                        {dict,4,16,16,8,80,48,
                                         {[],[],[],[],[],[],[],[],[],[],[],[],
                                          [],[],[],[]},
                                         {{[],[],[],[],[],[],[],[],[],[],
                                           [[<<"content-type">>,112,108,97,
                                             105,110,47,116,101,120,116],
                                            [<<"X-Riak-VTag">>,50,103,117,98,
                                             121,107,119,109,102,117,120,73,
                                             100,108,74,101,86,108,122,75,55,
                                             70]],
                                           [[<<"index">>,
                                             {<<"last_modify_int">>,3},
                                             {<<"tag_bin">>,<<"even">>}]],
                                           [],
                                           [[<<"X-Riak-Last-Modified">>|
                                             {1386,780159,925964}]],
                                           [],[]}}}}}:[{mochijson2,
                                                        json_encode,2,
                                                        [{file,
                                                          "src/mochijson2.erl"},
                                                         {line,149}]},
                                                       {mochijson2,
                                                        '-json_encode_proplist/2-fun-0-',
                                                        3,
                                                        [{file,
                                                          "src/mochijson2.erl"},
                                                         {line,167}]},
                                                       {lists,foldl,3,
                                                        [{file,"lists.erl"},
                                                         {line,1197}]},
                                                       {mochijson2,
                                                        json_encode_proplist,
                                                        2,
                                                        [{file,
                                                          "src/mochijson2.erl"},
                                                         {line,170}]},
                                                       {riak_kv_pb_mapred,
                                                        msgs_for_results,4,
                                                        [{file,
                                                          "src/riak_kv_pb_mapred.erl"},
                                                         {line,205}]},
                                                       {riak_kv_pb_mapred,
                                                        process_stream,3,
                                                        [{file,
                                                          "src/riak_kv_pb_mapred.erl"},
                                                         {line,89}]},
                                                       {riak_api_pb_server,
                                                        process_stream,5,
                                                        [{file,
                                                          "src/riak_api_pb_server.erl"},
                                                         {line,246}]},
                                                       {riak_api_pb_server,
                                                        handle_info,2,
                                                        [{file,
                                                          "src/riak_api_pb_server.erl"},
                                                         {line,129}]}]'

кто-нибудь может мне помочь?

РЕДАКТИРОВАТЬ:

ДЕЛАЯ ЭТО:

-module(mr_example).

-export([get_keys/3]).

% Returns bucket and key pairs from a map phase
get_keys(Value,_Keydata,_Arg) ->
  Meta  = riak_object:get_metadata(Value),
  Index = dict:fetch(<<"index">>, Meta),
  [{riak_object:key(Value), Index} ].

Я могу вернуть все индексы, но в некоторых случаях у меня есть один индекс с более чем одним значением, и таким образом он возвращает только последнее значение индекса. Помогите.

1 ответ

Хорошо, я обнаружил проблему.

Index - это массив кортежей, и я использовал keyfind для возврата значения индекса для tag_bin, а он возвращал последний элемент.

Другие вопросы по тегам