MapReduce:根据一个键列表映射来自另一个桶的对象(没有链接行走)?

时间:2013-03-18 21:18:54

标签: java scala mapreduce riak

编辑:看起来这个概念被称为“转发和收集”。在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阶段吗?我需要以某种方式改变水桶吗?谢谢你的帮助!

1 个答案:

答案 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])