我正在尝试将数据从mongoDB转储转换为镶木地板格式。我正在使用python,pymongo和shell脚本。
当我运行shell脚本使数据变得笨拙时,我得到了很多BSON文件,我没有找到直接转换BSON的方法 - >实木复合地板,所以我想做BSON - > JSON - >实木复合地板。
但是我不清楚如何将这些BSON文件转换为JSON,我从Pymongo尝试了bson.decode_file_iter(),它返回一个我不知道该怎么做的生成器。
<generator object decode_file_iter at 0x000002582B3F4C50>
我也尝试了bson.json_utils,但我也没想出如何使用它。当我使用dump方法时,我得到了一些奇怪的字符串,如。
["\u00e3\u0000\u0000\u0000\u0007_id\u0000[\u0007\u0012\u00f51\u02dc}n#\u00ff\u00d5)\u0002\"login\"\u0000\u0006\u0000\u0000\u0000araan\u0000\u0002\"nome\"\u0000\u0006\u0000\u0000\u0000araan\u0000\u0002\"perfil\"\u0000\b\u0000\u0000\u0000gerente\u0000\u0002\"solucao\"\u0000\u0007\u0000\u0000\u0000raizen\u0000\u0002\"senha\"\u0000A\u0000\u0000\u00008d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92\u0000\u0002_class\u0000\"\u0000\u0000\u0000com.tm.attendex.api.model.Usuario\u0000\u0000"]
编辑:我试图迭代生成器并得到以下错误:
File "C:/Users/fabio/PycharmProjects/MongoDump/mongodump.py", line 18, in <module>
for row in gen:
File "C:\Users\fabio\PycharmProjects\MongoDump\venv\lib\site-packages\bson\__init__.py", line 971, in decode_file_iter
obj_size = _UNPACK_INT(size_data)[0] - 4
TypeError: a bytes-like object is required, not 'str'
答案 0 :(得分:0)
是的,bson.decode_file_iter()(documentation)返回一个生成器,因为bson转储文件可能很大。您可以迭代生成器以将每一行作为dict(函数的'as_class'参数的默认值),其中列名是键,值是该行的对应值。
要将bson转换为json,可以将每行dict放入一个列表中,然后将列表转储到json文件中,
import bson
import json
gen = bson.decode_file_iter(open('table1.bson'))
json_list = []
for row in gen:
json_list.append(row)
json.dump(json_list, open('table1.json','w')
但它确实取决于RAM的大小。如果转储很大,json_list
将占用所有内存空间。我宁愿一行一行地写一个文件。
特别是,当您对Parquet(而非Hadoop生态系统)感兴趣时,我假设您正在处理大数据。您可以尝试批量执行bson-&gt; json-&gt; Parquet,保留您在列表中添加的行数,以转储为json。