我有一个运行eLevelDB后端的Riak DB,当我使用这个map reduce进行查询时,我会得到所有以JSON字符串形式返回的数据(如预期):
{
"inputs":"TWEETS_BY_ID",
"query":[
{"map":
{"language":"javascript",
"name":"Riak.mapValuesJson"
}
}]
}
这个查询很慢,我真的只想查询整个bucket的一个子集。我有一个带时间戳的辅助索引,所以我尝试运行这个mapreduce:
{
"inputs":
{
"bucket":"TWEETS_BY_ID",
"index":"timestamp_int",
"start":"1375736484000",
"end":"1375736485000"
},
"query":[
{"map":
{"language":"javascript",
"name":"Riak.mapValuesJson",
"keep":true
}
}
]
}
我得到这个错误:
{error,{exit,{json_encode,{bad_term,{1375736484000,<<"364491348659142656">>}}},
[{mochijson2,json_encode,2,
[{file,"src/mochijson2.erl"},{line,149}]},
{mochijson2,'-json_encode_proplist/2-fun-0-',3,
[{file,"src/mochijson2.erl"},{line,167}]},
{lists,foldl,3,[{file,"lists.erl"},{line,1197}]},
{mochijson2,json_encode_proplist,2,
[{file,"src/mochijson2.erl"},{line,170}]},
{mochijson2,'-json_encode_proplist/2-fun-0-',3,
[{file,"src/mochijson2.erl"},{line,167}]},
{lists,foldl,3,[{file,"lists.erl"},{line,1197}]},
{mochijson2,json_encode_proplist,2,
[{file,"src/mochijson2.erl"},{line,170}]},
{mochijson2,'-json_encode_array/2-fun-0-',3,
[{file,"src/mochijson2.erl"},{line,157}]}]}}
我确实升级到了今天发布的1.4.1版本,其中有一份关于二级索引和Javascript mapreduces的错误报告,但这似乎并没有改变我的错误。我甚至不知道如何开始调试它。有什么建议吗?
您发现了一个错误。当您对当前与mapreduce不兼容的索引执行范围查询时,有一种新的行为会返回匹配的术语。要解决此问题,如果您还没有源tar,请首先获取它。打开文件并在riak-1.4.1/deps/riak_kv/include
中编辑文件riak_kv_index.hrl
,更改行
return_terms=true :: boolean(), %% Note, should be false for an equals query
至
return_terms=false :: boolean(), %% Note, should be false for an equals query
要只编译索引模块,请运行
/usr/lib/riak/erts-5.9.1/bin/erlc -I riak-1.4.1/deps/riak_kv/include riak-1.4.1/deps/riak_kv/src/riak_index.erl
这将为您创建一个新的riak_index.beam
文件。
找到你的旧riak_index.beam
,备份它,用新的替换它,停止然后启动riak。在您的所有节点上重复此操作,您就应该重新开始工作了。