0

编辑:看起来这个概念被称为“转发和收集”。看看这在 Riak-Java 客户端中是如何工作的。

现在在 Riak 中执行一个简单的 MapReduce,它返回一个User对象键列表。为了简单起见,我想简单地将 a 的值映射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 阶段?我需要以某种方式更换水桶吗?谢谢您的帮助!

4

1 回答 1

2

我们以rolesOfClientAdminsbucket作为输入开始,拆分key得到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])
于 2013-03-18T23:19:54.143 回答