【问题标题】:MapReduce: map objects from another bucket against a list of keys (without link walking)?MapReduce:将另一个桶中的对象映射到键列表(没有链接步行)?
【发布时间】: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 客户端中是如何工作的。

标签: java scala mapreduce riak


【解决方案1】:

我们从 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])

【讨论】:

  • 看起来很简单,除了这是否引用了users 存储桶来提取值?我需要在某处添加链接吗?感谢您对此的帮助。
  • Np。我实际上并不熟悉您正在使用的客户端 - 但在这段代码中,存储桶称为 rolesOfClientAdmins。如果您的存储桶名为users,请在此处更改代码。如果它适合你,我会更新答案。
  • 啊,我明白了。基本上,由于一个用户可以有多个管理员关系,我们正在使用 2 个不同的存储桶。因此,我们从rolesOfClientAdmins 获取键列表,但用户对象本身将来自users 存储桶。抱歉,如果我没有说清楚。
  • 啊哈!我现在和你在一起。我们将对这个答案进行排序,然后可能值得更新您的问题;)
  • 赞赏。是的,我可以保证问题会得到更新,哈哈。
猜你喜欢
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
相关资源
最近更新 更多