1

以下のフォーマットのデータがあります。

タイプC_IDAssitorCollectionDateグラニュライトカウンター

A a 10 08-08-2012 00:00 15 0.9912378

B a 5 08-08-2012 00:00 15 0.1860929

C b 4 08-08-2012 00:00 15 0.5345317

教義と聖約108-08-201200:15 15 0.8656529

E b 1 08-08-2012 00:15 15 0.3249502

A a 10 08-08-2012 00:15 15 0.3743117

B a 5 08-08-2012 00:30 15 0.2608622

C b 4 08-08-2012 00:30 15 0.0079308

教義と聖約108-08-201200:30 15 0.7094781

E b 1 08-08-2012 00:45 15 0.6133461

A a 10 08-08-2012 00:45 15 0.3035875

B a 5 08-08-2012 00:45 15 0.6093015

C b 4 08-08-2012 01:00 15 0.4104008

教義と聖約108-08-201201:00 15 0.1687753

E b 1 08-08-2012 01:00 15 0.6627076

A a 10 08-08-2012 01:15 150.1901386....。

等々..

このテーブルで1時間ごとにインクリメンタルmapreduceを実行したいです。CollectionDateは、レコードがいつ来るかを示すフィールドです。しかし、c#.netで必要なこのコードはすべて

mapReduceを実行しましたが、問題は15分ごとに3レコード、1時間ごとに12レコードを取得しており、1時間後にこれらの15レコードが削減されます。次の1時間後に、残りのレコードも同じ基準で削減されます。

これについては、c#.netでのみサポートを受けることができますか。過去20日間から深刻な問題に直面しています。

その余分なcsvファイル..レコードを取得している場所から..nmongodbでc#を使用してmongodbに挿入すると、次のようになります:{"_id":a324b2f89d2e98fa21f、 "Type":A、 "C_ID":a、 "assitor":10、 "CollectionDate":08-08-2012 00:00、 "Granulity":15、 "Counter":0.1901386} {"_id":a324b2f89d2e98a216f、 "Type":B、 "C_ID":a、 "assitor":10、 "CollectionDate":08-08-2012 00:00、 "Granulity":15、 "Counter":0.1233542} {"_id":a324b2f89d2e98a3f2c、 "Type":A、 "C_ID":b、 "assitor":12、 "CollectionDate":08-08-2012 00:15、 "Granulity":12、 "Counter":0.8134552} {"_id":a324b2f89d2e98b4e2d、 "Type":B、"C_ID":b、 "assitor":12、 "CollectionDate":08-08-2012 00:15、 "Granulity":12、 "Counter":0.3218547}

OutputFile:{"_id":a8f3e231d456a675b23c、 "CollectionDate":08-08-2012 00:00 "AvgCounter":} {"_id":a8f3e232456a675a42cd、 "CollectionDate":08-08-2012 01:00 "AvgCounter":} {"_id":a8f3e231d46a67a0b4d2、 "CollectionDate":08-08-2012 02:00 "AvgCounter":}

毎時集計を意味します。

私がやったことまで...

private static void MapReduce(MongoDatabase db, String collName, BsonValue bsonValue, DateTime oldDateTime, DateTime newDateTime)
    {
        var collection = db.GetCollection<BsonDocument>(collName);
        Console.WriteLine(TotalReduction++); 
        String map = @"function() { 
                                var sample = this;
                                emit(sample.CollectionDate, {CID: sample.C_ID, count:1, CollectionTime: sample.CollectionDate});
                             }";
        String reduce = @"function(key, values) {
                                var result = {CID: '', count:0};
                                values.forEach(function(value){
                                    result.CID += value.CID;
                                    result.count += value.count;
                                    result.CollectionTime = value.CollectionTime;
                                });
                                return result;
                                }";
        var options = new MapReduceOptionsBuilder();
        IMongoQuery[] queries = { Query.EQ("CollectionTime", bsonValue) };
        options.SetOutput(MapReduceOutput.Inline);
        IMongoQuery query = Query.And(queries);
        var results = collection.MapReduce(queries[0], map, reduce);
        collection = db.GetCollection<BsonDocument>("MSS_REDUCE");
        IEnumerable<BsonDocument> bdoc = results.GetResultsAs<BsonDocument>();
        collection.InsertBatch<BsonDocument>(bdoc);
    }

ありがとうRaviSharma

4

1 に答える 1

0

そのため、データセットについてはまだ少し不明です。1つ指摘できることはありますが、うまくいけば役に立ちます...

マップでは、グループ化する実際の日付ではなく、すべてを含む日付を発行しています。代わりに、分、秒、およびミリ秒を削除したキーを発行する必要があります。さらに、_id でグループ化する場合は、それも発行する必要があります。

String map = @"function() { 
    var sample = this;
    var d = sample.CollectionDate;
    var newCollectionDate = new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), 0, 0, 0);
    emit({C_ID: sample.C_ID, CollectionDate: newCollectionDate}, {C_ID: sample.C_ID, Count: 1, CounterSum: sample.Counter, CounterAverage: 0, CollectionDate: newCollectionDate});
}";

次に、reduce 関数で値のカウントと合計を追跡する必要があります。

String reduce = @"function(key, values) {
    var result = {C_ID: key.C_ID, Count:0, CounterSum: 0, CounterAverage: 0, CollectionDate: key.CollectionDate};
    values.forEach(function(value){
        result.Count += value.Count;
        result.CounterSum += value.CounterSum;
    });
    return result;
}";

また、平均化を行うには finalize メソッドが必要です...

String finalize = @"function(key, value) {
    if(value.Count > 0) {
        value.CounterAverage = value.CounterSum / value.Count;
    }
    return value;
}";

これにより、必要な場所に移動できることを願っています。

于 2012-09-05T22:16:58.470 に答える