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 回答
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 的新地图数据类型很有用

于 2014-05-19T18:34:22.420 回答