Как получить данные из кортежа внутри битовой строки внутри списка в клиенте RIak-erlang

Я работаю над клиентом riak-erlang. при выполнении Mapreduce я получил следующий вывод.

Теперь я хочу получить данные из набора результатов, который я получил. Мне нужен возраст/имя, а также по определенному имени, которое я хочу получить.

Как я могу это сделать. Пожалуйста, помогите мне

{ok,[{0,R}]} = riakc_pb_socket:mapred(Pid,<<"test">>,[{map,{qfun,Mapf},none,true}]).
{ok,[{0,
  [<<"{\"age\": 24, \"name\": \"krishna\"}">>,
   <<"{\"age\": 29, \"name\": \"sharat\"}">>,
   <<"{\"age\": 25, \"name\": \"ramesh\"}">>,
   <<"{\"age\": 28, \"name\": \"kumar\"}">>,
   <<"{\"age\": 24, \"name\": \"gopi\"}">>,
   <<"{\"age\": 27, \"name\": \"anil\"}">>]}]}

НРАВИТСЯ: возраст: 24 года

or

name: "krishna"

или если я назову имя:Кришна

age:24

Как я могу получить данные


person Krish gopi    schedule 19.05.2014    source источник


Ответы (2)


По сути, вы получаете данные в кодировке json, поэтому сначала вам нужно их декодировать, а затем реализовать некоторый механизм фильтрации/поиска. Мой подход заключался бы в использовании парсера jiffy json:

Во-первых, клонируйте и соберите в кратчайшие сроки:

git clone [email protected]:davisp/jiffy.git;
cd jiffy; make

Вы должны добавить jiffy в путь кода при запуске клиента командной строки erlang:

erl -pa Private/jiffy/ebin -pa Private/jiffy/deps

И, наконец, реализация для получения возраста по имени:

-module(test).
-compile(export_all).

decode(Results) ->
   [jiffy:decode(E)||E<-Results].

get_age(_, []) ->
    erlang:throw(name_not_found);
get_age(Name, [{H}|T]) ->
    case proplists:get_value(<<"name">>, H) of
        Name -> proplists:get_value(<<"age">>, H);
        _ -> get_age(Name, T)
    end.

Применение:

erl -pa Private/jiffy/ebin -pa Private/jiffy/deps
Erlang R16B03 (erts-5.10.4) [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V5.10.4  (abort with ^G)
1> application:start(jiffy).
ok
2> c(test).
{ok,test}
3> {ok, [{0, Results}]} = {ok,[{0,
3>   [<<"{\"age\": 24, \"name\": \"krishna\"}">>,
3>    <<"{\"age\": 29, \"name\": \"sharat\"}">>,
3>    <<"{\"age\": 25, \"name\": \"ramesh\"}">>,
3>    <<"{\"age\": 28, \"name\": \"kumar\"}">>,
3>    <<"{\"age\": 24, \"name\": \"gopi\"}">>,
3>    <<"{\"age\": 27, \"name\": \"anil\"}">>]}]}.
{ok,[{0,
      [<<"{\"age\": 24, \"name\": \"krishna\"}">>,
       <<"{\"age\": 29, \"name\": \"sharat\"}">>,
       <<"{\"age\": 25, \"name\": \"ramesh\"}">>,
       <<"{\"age\": 28, \"name\": \"kumar\"}">>,
       <<"{\"age\": 24, \"name\": \"gopi\"}">>,
       <<"{\"age\": 27, \"name\": \"anil\"}">>]}]}
4> Decoded = test:decode(Results).
[{[{<<"age">>,24},{<<"name">>,<<"krishna">>}]},
 {[{<<"age">>,29},{<<"name">>,<<"sharat">>}]},
 {[{<<"age">>,25},{<<"name">>,<<"ramesh">>}]},
 {[{<<"age">>,28},{<<"name">>,<<"kumar">>}]},
 {[{<<"age">>,24},{<<"name">>,<<"gopi">>}]},
 {[{<<"age">>,27},{<<"name">>,<<"anil">>}]}]
5> test:get_age(<<"krishna">>, Decoded).
24
6>
person mkorszun    schedule 19.05.2014
comment
то, что вы сказали, верно, но я уже использую erlangshell с клиентом riak-erlang от erl -pa /home/downloads/riak-erlang-client/ebin/. Затем, если использовать jiffy для запуска оболочки erlang, я не получу свойства свойств клиента riak-erlang. - person Krish gopi; 19.05.2014
comment
Я не уверен, понял ли я вашу точку зрения, но вы можете добавить несколько каталогов в путь кода, используя клиент erl. Вы можете просто вызвать 'erl -pa JIFFY_PATHS -pa RIAK_CLIENT' - person mkorszun; 19.05.2014
comment
о.. не знаю об этом. если это произойдет, то это хорошо. есть ли другой вариант без Jiffy @Mkorszun - person Krish gopi; 19.05.2014
comment
Если мы используем сервер riak, и я хочу отправить mapreduce, написанный на erlang, из программы python. тогда я должен установить jiffy на сервер, где работает riak. - person Krish gopi; 19.05.2014
comment
Если вам нужны альтернативы jiffy, проверьте это stackoverflow.com/questions/2395992/. - person mkorszun; 19.05.2014
comment
я получаю эту ошибку: Инициализирован пустой репозиторий Git в /tmp/jiffy/.git/ Подлинность хоста «github.com (192.30.252.131)» не может быть установлена. Отпечаток ключа RSA: 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48. Вы уверены, что хотите продолжить подключение (да/нет)? да Предупреждение: «github.com,192.30.252.131» (RSA) навсегда добавлен в список известных хостов. Отказано в доступе (publickey). - person Krish gopi; 19.05.2014
comment
mochijson2 встроен в риак что ли? - person Krish gopi; 21.05.2014

Альтернативный подход, если вы не привязаны к использованию JSON: если ваше приложение использует Erlang, рассмотрите возможность использования пропслиста при сохранении объектов. Если бы вы сохраняли каждое значение в виде
[{<<"age">>,24},{<<"name">>,<<"krishna">>}],
возврат от вашего MR мог бы выглядеть примерно так:

{ok,[{0, 
     [{<<"age">>, 24}, {<<"name">>, <<"krishna">>}],
     [{<<"age">>, 29}, {<<"name">>, <<"sharat">>}],
     [{<<"age">>, 25}, {<<"name">>, <<"ramesh">>}]}]}

Затем вы можете использовать что-то вроде
[ {proplists:get_value(<<"name">>,V),proplists:get_value(<<"age">>,V) || V <- R ].
для возврата:

[{<<"krishna">>,24},
 {<<"sharat">>,29},
 {<<"ramesh">>,25}]

Чтобы извлечь определенное поле из определенной записи, вы можете использовать:

[ "age: " ++ integer_to_list(proplists:get_value(<<"age">>,Record) || 
      Record <- R, proplists:get_value(<<"name">>,Record) =:= <<"krishna">> ].

Также обратите внимание на клиент, совместимый с R17, вы можете найти новую карту Erlang. полезный тип данных

person Joe    schedule 19.05.2014