如何在RIak erlang客户端中从bitstring内部列表中的元组中获取数据

如何在RIak erlang客户端中从bitstring内部列表中的元组中获取数据,erlang,riak,erlang-shell,riak-search,Erlang,Riak,Erlang Shell,Riak Search,我在riak erlang客户机上工作。在执行Mapreduce时,我得到了以下输出 现在,我想从我得到的结果集中获取数据。我想要年龄/姓名,以及我想要获得年龄的特定姓名 我该怎么做,请帮帮我 {ok,[{0,R}]} = riakc_pb_socket:mapred(Pid,<<"test">>,[{map,{qfun,Mapf},none,true}]). {ok,[{0, [<<"{\"age\": 24, \"name\": \"krishna\"

我在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\"}">>]}]}
或者如果我说出名字:奎师那

age:24

如何获取数据基本上,您可以获取json编码的数据,因此首先需要对其进行解码,然后实现一些过滤/查找机制。我的方法是使用:

首先,克隆并构建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.
-模块(测试)。
-编译(全部导出)。
解码(结果)->
[杰菲:解码(E)| | E
erlang:throw(未找到名称);
获取年龄(姓名[{H}|T])->
案例属性列表:获取
名称->属性列表:获取_值(,H);
_->获得年龄(姓名,T)
结束。
用法:

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>
erl-pa Private/jiffy/ebin-pa Private/jiffy/deps
Erlang R16B03(erts-5.10.4)[源代码][64位][smp:8:8][异步线程:10][hipe][内核轮询:false]
Eshell V5.10.4(使用^G中止)
1> 应用:启动(jiffy)。
好啊
2> c(测试)。
{好的,测试}
3> {ok,[{0,Results}]}={ok,[{0,
3>   [,
3>    ,
3>    ,
3>    ,
3>    ,
3>    ]}]}.
{好的,[{0,
[,
,
,
,
,
]}]}
4> 解码=测试:解码(结果)。
[{[{,24},{,}]},
{[{,29},{,}]},
{[{,25},{,}]},
{[{,28},{,}]},
{[{,24},{,}]},
{[{,27},{,}]}]
5> 测试:获取年龄(,解码)。
24
6>

如果您没有锁定使用JSON,则使用另一种方法:如果应用程序使用Erlang,则在存储对象时考虑使用PROPLIST。如果您存储每个值,如

[{,24},{,}]

您的MR返回的结果可能类似于:

{ok,[{0, 
     [{<<"age">>, 24}, {<<"name">>, <<"krishna">>}],
     [{<<"age">>, 29}, {<<"name">>, <<"sharat">>}],
     [{<<"age">>, 25}, {<<"name">>, <<"ramesh">>}]}]}
{ok,[{0,
[{, 24}, {, }],
[{, 29}, {, }],
[{, 25}, {, }]}]}
然后您可以使用类似

[{proplist:get_值(,V),proplist:get_值(,V)| | V您所说的是对的,但是我已经通过erl-pa/home/downloads/riak erlang client/ebin/使用了带有riak erlang客户端的erlangshell。如果使用jiffy启动erlang shell,那么我将无法获得riak erlang客户端属性的属性。我不确定是否理解您的观点,但是您可以使用erl客户端。你可以直接调用“erl-pa JIFFY_path-pa RIAK_client”哦..我不知道。如果发生这种情况,那就很好了。如果我们使用RIAK服务器,我想从python程序发送用erlang编写的mapreduce,没有JIFFY@mkorszu还有其他选项吗?然后我必须在RIAK运行的服务器上安装JIFFY。如果你需要一些替代品给杰菲,检查这个。
{ok,[{0, 
     [{<<"age">>, 24}, {<<"name">>, <<"krishna">>}],
     [{<<"age">>, 29}, {<<"name">>, <<"sharat">>}],
     [{<<"age">>, 25}, {<<"name">>, <<"ramesh">>}]}]}
[{<<"krishna">>,24},
 {<<"sharat">>,29},
 {<<"ramesh">>,25}]
[ "age: " ++ integer_to_list(proplists:get_value(<<"age">>,Record) || 
      Record <- R, proplists:get_value(<<"name">>,Record) =:= <<"krishna">> ].