0

編集:この概念は「転送と収集」として知られているようです。これが Riak-Java クライアントでどのように機能するかを確認します。

現在、オブジェクトのキーのリストを返す単純な MapReduce を Riak で実行してい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

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])
于 2013-03-18T23:19:54.143 に答える