【问题标题】:Convert mongodump BSON files to Parquet将 mongodump BSON 文件转换为 Parquet
【发布时间】:2018-11-08 10:26:31
【问题描述】:

我正在尝试将数据从 mongoDB 转储转换为 parquet 格式。我正在为此使用 python、pymongo 和一个 shell 脚本。

当我运行 shell 脚本对数据进行哑化时,我得到了很多 BSON 文件,我没有找到直接转换 BSON -> Parquet 的方法,所以我正在尝试做 BSON -> JSON -> Parquet。

但是我不知道如何将这些 BSON 文件转换为 JSON,我尝试了 Pymongo 的 bson.decode_file_iter(),它返回了一个我不知道如何处理的生成器。

<generator object decode_file_iter at 0x000002582B3F4C50>

我也尝试了 bson.json_utils 但我也没有弄清楚如何使用它。当我使用转储方法时,我得到了一些奇怪的字符串。

 ["\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'

【问题讨论】:

    标签: python json mongodb pymongo bson


    【解决方案1】:

    是的,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->json->Parquet,保留您在列表中添加的行数以转储为 json。

    【讨论】:

    • 感谢您的回复,我尝试了代码,但收到了我在编辑部分粘贴的错误。也许是由于python如何打开文件和默认编码? (我现在使用的是 windows,但是一旦完成,脚本可能会在 linux EC2 实例上运行)
    • 根据您的编辑,您的“gen”似乎是一个字符串。上面的代码示例在 ubuntu 上使用 python 2.7 运行良好。但我不认为 windows 环境有问题。
    猜你喜欢
    • 2018-07-31
    • 2016-03-23
    • 2022-01-17
    • 2017-05-20
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    相关资源
    最近更新 更多