2
我確實有類似下面超過十億對象的表:MongoDB的彙總查詢64 MB限制
{
"_id" : ObjectId("5893ae4f7a5449caebba5848"),
"id" : NumberLong(1234567890),
"inserted_at" : ISODate("2017-02-02T22:10:23.812Z")
}
它保存在MongoDB的3.2.11。
我每週插入近5000萬條新記錄,需要比較新的一週記錄和前一週的記錄。
因此,我建立了一個這樣的查詢:
db.getCollection('table').aggregate(
[
{"$group" : {
"_id": {
"year": { "$year": "$inserted_at"},
"week": { "$week": "$inserted_at"}},
"Content_IDs": { "$push": "$id"}}},
{ "$sort": {'_id.year': -1, '_id.week': -1}},
{ "$limit": 2},
{ "$group": {
"_id": null,
"Last": { $first: "$Content_IDs" },
"Previous": { $last: "$Content_IDs"}
}},
{ $project: {
"Outgoing": { $setDifference: [ "$Previous", "$Last" ] },
"Incoming": { $setDifference: [ "$Last", "$Previous" ] }}},
],
{allowDiskUse:true}
)
但是MongoDB中無法計算,因爲數據的大小的結果。
該錯誤是如下:
斷言:命令失敗:{ 「OK」:0, 「ERRMSG」: 「BufBuilder試圖 成長()到134217728個字節,過去的64MB極限」 「代碼」:13548}
我已經嘗試了所有記錄讀取到Python的包膜,這樣我可以有計算的結果,但我得到了同樣的錯誤,當我運行pymongo.aggregate以下管道:
[
{"$group" : {
"_id": {
"year": { "$year": "$inserted_at"},
"week": { "$week": "$inserted_at"}},
"Content_IDs": { "$push": "$id"}}},
{ "$sort": SON([('_id.year', -1), ('_id.week', -1)])},
{ "$limit": 2}
]
它適用於較小規模的數據。我怎樣才能使這個查詢更具擴展性?有什麼建議麼?
非常感謝!
我想我需要澄清一些。我對Spark和Scala都沒有任何專業知識。 您是否建議使用-Spark,即通過MongoDB Connector for Spark與MongoDB一起使用?在這種情況下,MongoDB是否可以向Spark提供大量數據進行處理,但無法提供給Python? 謝謝 – user2386488
嘿,Spark有Scala和Python的連接器,顯然這兩個工作正常。我只是覺得mongodb standalone無法處理工作。 Spark將分發數據並執行一些技巧來執行分析。但請注意,我是新手,所以我可能會說大量的廢話 –