Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Erlang在Riak上使用MapReduce从存储1到1000的数字的所有键中获得偶数值_Erlang_Riak_Erlang Shell - Fatal编程技术网

如何使用Erlang在Riak上使用MapReduce从存储1到1000的数字的所有键中获得偶数值

如何使用Erlang在Riak上使用MapReduce从存储1到1000的数字的所有键中获得偶数值,erlang,riak,erlang-shell,Erlang,Riak,Erlang Shell,我正在尝试用Erlang在Riak上制作mapreduce。我有如下数据: Bucket = "Numbers" {Keys,values} = {Random key,1},{Random key,2}........{Random key,1000}. 现在,我存储了1000个从1到1000的值,其中所有键都是由作为参数给定的undefined自动生成的,因此所有键的值都是从1到1000 所以我只需要偶数值的数据。使用mapreduce,如何实现这一点?您可以按照中所述构造相位函数 一个

我正在尝试用Erlang在Riak上制作mapreduce。我有如下数据:

Bucket = "Numbers"
{Keys,values} = {Random key,1},{Random key,2}........{Random key,1000}. 
现在,我存储了1000个从1到1000的值,其中所有键都是由作为参数给定的undefined自动生成的,因此所有键的值都是从1到1000


所以我只需要偶数值的数据。使用mapreduce,如何实现这一点?

您可以按照中所述构造相位函数

一个可能的映射功能:

Mapfun = fun(Object, _KeyData, _Arg) ->
    %% get the object value, convert to integer and check if even
    Value = list_to_integer(binary_to_term(riak_object:get_value(Object))),
    case Value rem 2 of
      0 -> [Value];
      1 -> []
    end
end.
尽管您可能不希望在遇到兄弟姐妹时完全失败:

Mapfun = fun(Object, _KeyData, _Arg) ->
    Values = riak_object:get_values(Object),
    case length(Values) of        %% checking for siblings
      1 ->                   %% only 1 value == no siblings
         I = list_to_integer(binary_to_term(hd(Values))),
         case I rem 2 of
            0 -> [I];    %% value is even
            1 -> []          %% value is odd
         end;
      _ -> []                %% What should happen with siblings?
    end
end.
您可能还需要防止或检查其他情况:包含非数字字符的值、空值、已删除的值(逻辑删除的值),仅举几个例子

编辑:
警告:执行完整存储桶MapReduce作业将需要Riak从磁盘读取每个值,这可能会在相当大的数据集上造成极端的延迟和超时。可能不是你想在生产中做的事情


形成MapReduce的完整示例(出于空间考虑,仅限于数字1到200):

假设您已经克隆并构建了
使用上面的第二个Mapfun

erl -pa {path-to-riak-erlang-client}/ebin
定义一个reduce函数对列表进行排序

Reducefun = fun(List,_) -> 
    lists:sort(List) 
end.
连接到本地Riak服务器

{ok, Pid} = riakc_pb_socket:start_link("127.0.0.1", 8087).
生成一些测试数据

[ riakc_pb_socket:put(
                  Pid,
                  riakc_obj:new(
                            <<"numbers">>,
                            list_to_binary("Key" ++ V),V
                            )
                  ) || V <- [ integer_to_list(Itr) || Itr <- lists:seq(1,200)]],
结果
将是一个
[{{{u阶段索引},{u阶段输出}]
的列表,每个阶段的
保留
为真,在本例中两个阶段都标记为保留,因此在本例中
结果
将为
[{0,[[u映射阶段结果]},{1,[[u减少阶段结果]}]

打印出每个阶段的结果:

[ io:format("MapReduce Result of phase ~p:~n~P~n",[P,Result,500]) 
                || {P,Result} <- Results ].

我已经完成了你所说的第一步,我得到了“#乐趣”,这意味着什么我应该给参数什么我的意思是,给“Mapfun(X,Y,Z)”@joey你不直接调用它,你把函数作为MapReduce调用的一部分传递。如何做到这一点将取决于您使用的客户端。Basho的网站上有一些例子。如何编写它,我不知道。假设您使用的是Erlang客户端,的mapreduce部分应该会让您朝着正确的方向前进。
[ io:format("MapReduce Result of phase ~p:~n~P~n",[P,Result,500]) 
                || {P,Result} <- Results ].
MapReduce Result of phase 0:
[182,132,174,128,8,146,18,168,70,98,186,118,50,28,22,112,82,160,114,106,12,26,
 124,14,194,64,122,144,172,96,126,162,58,170,108,44,90,104,6,196,40,154,94,
 120,76,48,150,52,4,62,140,178,2,142,100,166,192,66,16,36,38,88,102,68,34,32,
 30,164,110,42,92,138,86,54,152,116,156,72,134,200,148,46,10,176,198,84,56,78,
 130,136,74,190,158,24,184,180,80,60,20,188]
MapReduce Result of phase 1:
[2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,
 56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,
 104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,
 142,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,176,178,
 180,182,184,186,188,190,192,194,196,198,200]
[ok,ok]