0

私は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

また

name: "krishna"

または私が名前を付ける場合:クリシュナ

age:24

どうすればデータを取得できますか

4

2 に答える 2

1

基本的に、json でエンコードされたデータを取得するため、まずそれをデコードしてから、フィルタリング/検出メカニズムを実装する必要があります。私のアプローチは、jiffy json parserを使用することです:

まず、クローンを作成して jiffy をビルドします。

git clone git@github.com:davisp/jiffy.git;
cd jiffy; make

erlang コマンド ライン クライアントの実行中にコード パスに jiffy を追加する必要があります。

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>
于 2014-05-19T11:29:13.420 に答える