2015-03-16 22 views
2

У меня есть большая коллекция mongoDB. Я хочу экспортировать эту коллекцию в CSV, чтобы затем импортировать ее в пакет статистики для анализа данных.Mongoexport to multiple csv files

В коллекции имеется около 15 ГБ документов. Я хотел бы разделить коллекцию на ~ 100 одинаковых CSV-файлов. Есть ли способ достичь этого с помощью mongoexport? Я мог бы также запросить всю коллекцию в pymongo, разделить ее и написать в CSV-файлы вручную, но я думаю, что это будет медленнее и потребует больше кодирования.

Благодарим за ввод.

ответ

3

Вы можете сделать это, используя --skip & --limit.

Например, если вы, что ваша коллекция имеет 1000 документ, который вы можете сделать это с помощью цикла сценария (псевдо-код):

loops = 100 
count = db.collection.count() 
batch_size = count/loops 

for (i = 0; i < loops; i++) { 
    mongoexport --skip (batch_size * i) --limit batch_size --out export${i}.json ... 
} 

Принимая во внимание, что ваши документы примерно равны по размеру.

Обратите внимание, что большие пропуски медленны.

Итерации нижней границы будут быстрее, чем верхние итерации.

0

Лучше версия выше цикла, который делает все это параллельно, потому что ты нетерпеливый sonnofabitch, как я:

предполагают, мы имеем 385892079 записи, разделите на 100.

let bs=3858920 for i in {1..100} do let bsi=${bs}*$i mongoexport --db dbnamehere --collection collectionNamehere --port 3303\ --fields="f1,f2,f3" \ --out /opt/path/to/output/dir/dump.${i}.json -v \ --skip ${bsi} --limit ${bs} done

0
#total=335584 
limit=20974; 
skip=0; 
for i in {1..16}; do mongoexport --host localhost --db tweets --collection mycollection --type=csv --fields tweet_id,user_name,user_id,text --out master_new/mongo_rec_${i}.csv -v --skip ${skip} --limit ${limit} --quiet; let skip=$((skip+limit)); done