データがロードされた4つのriakノードのクラスターがあります。集約するだけの単純なMapReduceジョブを実行しようとしていますが、独自のjavascript関数を提供することで実行しようとしています(より複雑なMapReduceジョブに移動するため)。
私の関連するJavaスニペットは次のとおりです。
IndexQuery iq = new IntRangeQuery(IntIndex.named(indexId), bucketId, 11, 40);
Function mapfunc = new JSSourceFunction(
streamToString(MapReduceDriver.class.getResourceAsStream("/map_1.js")));
Function redfunc = new JSSourceFunction(
streamToString(MapReduceDriver.class.getResourceAsStream("/reduce_1.js")));
PBMapReduceResult result = (PBMapReduceResult) riakClient.mapReduce(iq)
.addMapPhase(mapfunc)
.addReducePhase(redfunc)
.execute();
2つのjavascript関数は次のとおりです。
function map_keepAttr(value, keyData, arg) {
var data = Riak.mapValuesJson(value)[0];
return [ data.Attribute_17 ];
}
function reduce_aggregate(values, arg) {
return [values.length];
}
私が見ている問題は次のとおりです。クエリとマップフェーズによって生成される値は正確に30個あります。ただし、reduceフェーズでは30ではなく3が報告されます(したがって、正しくカウントされません)。さらに奇妙なのは、次のreduce関数を使用すると次のようになることです。
function reduce_aggregate(values, arg) {
return values.length;
}
期待どおりの結果、つまり正確に30個のエントリを含むjson配列が得られます。
RiakのMapReduceがどのように機能するかわからないように見えるので、どんな助けでも私を救うでしょう。
ありがとう!