【发布时间】:2013-03-18 21:18:54
【问题描述】:
编辑:看起来这个概念被称为“转发和收集”。看看这在 Riak-Java 客户端中是如何工作的。
现在在 Riak 中执行一个简单的 MapReduce,它返回 User 对象的键列表。为了简单起见,我想简单地将 User 的值映射到键并返回用户列表。这是到目前为止我在 Scala 中所得到的(使用 Java 客户端),仅供参考,密钥是复合的,看起来像 clientId-userId:
val map = new JSSourceFunction("""
function(riakObject){
var rolek = riakObject.key;
return [rolek];
}
""")
val reduce = new JSSourceFunction("""
function(value){
var returnValue=[], splitarr=[];
for(i=0;i<value.length;i++){
splitarr=String(value[i]).split("-");
returnValue = returnValue.concat([splitarr[1]]);
}
return returnValue;
}
""")
DB.client.mapReduce("rolesOfClientAdmins")
.addKeyFilter(new TokenizeFilter("-", 1))
.addKeyFilter(new MatchFilter(clientId))
.addMapPhase(map)
.addReducePhase(reduce)
.execute().getResult(classOf[String])
我是否在 Reduce 阶段之后添加另一个 Map 阶段?我需要以某种方式更换水桶吗?感谢您的帮助!
【问题讨论】:
-
您不会在 reduce 之后添加地图 - 在您收集所有数据并使用一个或多个地图阶段后运行 reduce
-
嗯明白了。从谷歌的研究来看,我似乎还需要在映射阶段返回存储桶,比如
return [[value.bucket, value.key]] -
如果你想添加另一个map阶段,那么你需要将bucket和key一起返回。我不确定您的问题是什么才能写出完整的答案:)
-
我可以看到我不清楚的地方。基本上,上面的代码已经从
rolesOfClientAdmins存储桶返回了一个键(用户ID)列表。相反,我想返回存储在users存储桶中的完整用户对象。类似于 SQL 连接,但不确定它在 Java 客户端中是如何工作的。