我正在研究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\"}">>]}]}
LIKE: 年龄:24岁
或
name: "krishna"
或者如果我给出名字:krishna
age:24
我如何获取数据
答案 0 :(得分: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>
答案 1 :(得分:1)
如果您没有使用JSON,则可以使用另一种方法:如果您的应用程序使用Erlang,请考虑在存储对象时使用proplist。如果你要存储每个值,如
[{<<"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的新map数据类型很有用