将mongodump BSON文件转换为Parquet

时间:2018-05-29 17:30:02

标签: python json mongodb pymongo bson

我正在尝试将数据从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'

1 个答案:

答案 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。