编辑:看起来这个概念被称为“转发和收集”。在Riak-Java客户端看看它是如何工作的。
现在在Riak中执行一个简单的MapReduce,它返回User
个对象的键列表。为了简单起见,我想简单地将User
的值映射到键并返回用户列表。这是我到目前为止在Scala中使用的内容(使用Java客户端)和FYI,密钥是复合的,看起来像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阶段吗?我需要以某种方式改变水桶吗?谢谢你的帮助!
答案 0 :(得分:2)
我们从rolesOfClientAdmins
桶作为输入开始,并拆分密钥以获取User
对象的ID。然后将存储桶名称“users”和用户ID传递到下一个映射阶段。
val mapRolesBucket = new JSSourceFunction("""
function(value){
var splitarr=value.key.split('-');
return [[ 'users', splitarr[1] ]];
}
""")
val mapUsersBucket = new JSSourceFunction("""
function(value){
var obj = Riak.mapValuesJson(value)[0];
return [ obj ];
}
""")
DB.client.mapReduce("rolesOfClientAdmins")
.addKeyFilter(new TokenizeFilter("-", 1))
.addKeyFilter(new MatchFilter(clientId))
.addMapPhase(mapRolesBucket)
.addMapPhase(mapUsersBucket)
.execute().getResult(classOf[String])