Riak Erlang映射/reduce返回{error,notfound}

Riak Erlang映射/reduce返回{error,notfound},erlang,mapreduce,riak,Erlang,Mapreduce,Riak,我正在运行以下Riak映射阶段: -module(delete_map_function). -export([get_keys/3]). %Returns bucket and key pairs from a map phase get_keys(Value,_Keydata,_Arg) -> [[riak_object:bucket(Value),riak_object:key(Value)]]. 以及以下Riak减少阶段: 我一直收到以下错误消息: {"phase":0,

我正在运行以下Riak映射阶段:

-module(delete_map_function).

-export([get_keys/3]).

%Returns bucket and key pairs from a map phase
get_keys(Value,_Keydata,_Arg) ->
  [[riak_object:bucket(Value),riak_object:key(Value)]].
以及以下Riak减少阶段:

我一直收到以下错误消息:

{"phase":0,"error":"function_clause","input":"{{error,notfound},{<<\"my_bucket\">>,<<\"item_key\">>},undefined}","type":"error","stack":"[{riak_object,bucket,[{error,notfound}],[{file,\"src/riak_object.erl\"},{line,251}]},{delete_map_function,get_keys,3,[{file,\"delete_map_function.erl\"},{line,7}]},{riak_kv_mrc_map,map,3,[{file,\"src/riak_kv_mrc_map.erl\"},{line,164}]},{riak_kv_mrc_map,process,3,[{file,\"src/riak_kv_mrc_map.erl\"},{line,140}]},{riak_pipe_vnode_worker,process_input,3,[{file,\"src/riak_pipe_vnode_worker.erl\"},{line,444}]},{riak_pipe_vnode_worker,wait_for_input,2,[{file,\"src/riak_pipe_vnode_worker.erl\"},{line,376}]},{gen_fsm,...},...]"}
我在某个地方读到过,我应该在映射阶段使用
filter\u notfound
参数,但即使添加了它,我仍然会得到错误:

MapReduceResult mapReduceResult = RiakUtils.getPBClient().mapReduce(iq)
                 .addMapPhase(new NamedErlangFunction("delete_map_function", "get_keys"), "filter_notfound")
                 .addReducePhase(new NamedErlangFunction("delete_reduce_function", "delete"))
                 .execute();

我正在运行Riak 1.3并首先使用v1.1.0。我认为通过map/reduce阶段删除密钥不是一种有效的方法。若你们得到了密钥列表并将其提供给映射阶段,riak将首先读取所有对象,然后将其提供给你们的函数。所以,若您只需要删除对象,最好不用读取就删除

第二。应编写所有map/reduce函数,但以下情况除外:

  • 由于riak的最终性质,您可以得到
    {error,notfound}
    ,而不是
    Value
  • 您还可以将删除的riak对象作为
    。您可以知道该对象已被特殊标志删除
    dict:is_key(,riak_object:get_metadata(RiakObj))
第三,。要修复错误,应从列表中筛选notfound键:

get_keys({error, notfound},_Keydata,_Arg) ->
    [];
get_keys(Value,_Keydata,_Arg) ->
    [[riak_object:bucket(Value),riak_object:key(Value)]].

我有一个erlang映射阶段,它只返回值直到墓碑键,并退出映射阶段。你能告诉我我做错了什么吗?如果你愿意,我可以在这里粘贴代码。
get_keys({error, notfound},_Keydata,_Arg) ->
    [];
get_keys(Value,_Keydata,_Arg) ->
    [[riak_object:bucket(Value),riak_object:key(Value)]].