我有一个很大的mongoDB集合。我想将此集合导出为CSV,然后我可以将其导入统计包中以进行数据分析。
该集合中包含大约15 GB的文档。我想将这个集合拆分成~100个大小相同的CSV文件。有没有办法用mongoexport实现这个目的?我也可以在pymongo中查询整个集合,拆分它并手动写入csv文件,但我想这会慢一点,需要更多编码。
感谢您提供意见。
答案 0 :(得分:3)
您可以使用--skip
& --limit
选项。
例如,如果您的集合包含1,000个文档,则可以使用脚本循环(伪代码)执行此操作:
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 ...
}
考虑到您的文件大小相等。
但请注意,大跳过很慢。
下限迭代将比上限迭代更快。
答案 1 :(得分:0)
更好的上述循环版本可以并行执行,因为你像我一样不耐烦的sonnofabitch:
假设我们有385892079条记录,除以100。
No. Time Source Destination Protocol Length Info
51 2.476681000 192.168.0.33 192.185.47.210 TCP 62 1143→443 [SYN] Seq=0 Win=65535 Len=0 MSS=1460 SACK_PERM=1
52 2.534541000 192.185.47.210 192.168.0.33 TCP 62 443→1143 [SYN, ACK] Seq=0 Ack=1 Win=29200 Len=0 MSS=1460 SACK_PERM=1
53 2.534559000 192.168.0.33 192.185.47.210 TCP 54 1143→443 [ACK] Seq=1 Ack=1 Win=65535 Len=0
54 2.534720000 192.168.0.33 192.185.47.210 TLSv1 163 Client Hello
56 2.592332000 192.185.47.210 192.168.0.33 TCP 60 443→1143 [ACK] Seq=1 Ack=110 Win=29200 Len=0
57 2.594550000 192.185.47.210 192.168.0.33 TLSv1 191 Server Hello, Change Cipher Spec, Encrypted Handshake Message
58 2.596455000 192.168.0.33 192.185.47.210 TCP 54 1143→443 [FIN, ACK] Seq=110 Ack=138 Win=65398 Len=0
60 2.654542000 192.185.47.210 192.168.0.33 TCP 60 443→1143 [FIN, ACK] Seq=138 Ack=111 Win=29200 Len=0
61 2.654558000 192.168.0.33 192.185.47.210 TCP 54 1143→443 [ACK] Seq=111 Ack=139 Win=65398 Len=0
答案 2 :(得分: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