我想使用 JavaScript 对 Riak DB 中的数据执行 MapReduce 作业。但一开始就陷入困境,我无法理解它是如何返回值的。
client = riak.RiakClient()
query = client.add('user')
query.map("""
function(v){
var i=0;
i++;
return [i];
}
""")
for result in query.run():
print "%s" % (result);
为了简单起见,我检查了上面的例子。
这里查询的bucket和user包含RiakDB中的五组数据。 我认为map()返回单个值,但它返回具有5个值的数组,我认为相当于RiakDB中的五组数据。
1
1
1
1
1
这里,为什么我只能返回数组?它独立处理每个数据集,并返回每个数据集。所以我想我有五个1。由于这个原因,当我在 map() 中处理获取的数据时,返回给我带来了意想不到的结果。
所以请给我一些建议。我认为这是基本的事情,但我无法得到它。我非常感谢你的帮助。
最佳答案
当您运行 MapReduce 作业时,映射阶段代码将发送到存储数据的 vnode,并针对数据中的每个值执行该代码。收集结果数组并将其传递到单个归约阶段,该阶段也返回一个数组。如果结果足够多,则reduce阶段可以运行多次,以之前的reduce结果和一批map结果作为输入。
您获得 5 个结果意味着在您的存储桶中看到了 5 个 key 。映射阶段函数的实例之间没有共享全局状态,因此每个实例都有一个独立的 i
,这就是每个结果都是 1
的原因。
您可以尝试返回[v.key]
,以便每个值都有唯一的东西,或者如果预计值很小,您可以返回[JSON.stringify( v)]
,这样您就可以看到传递给 map 的整个结构。
您应该注意,根据 docs site javascript MapReduce 已被正式弃用,因此您可能需要使用 Erlang 函数进行新的开发。
关于javascript - 使用 javascript 和 python 在单节点中进行 Riak MapReduce,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39642462/