Конвертируйте файлы BSON mongodump в паркет - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь преобразовать данные из дампа mongoDB в формат паркета.Для этого я использую python, pymongo и сценарий оболочки.

Когда я запускаю сценарий оболочки для обработки данных, которые у меня есть, я получаю много BSON-файлов, я не нашел способа прямого преобразования BSON -> ParquetЯ пытаюсь сделать BSON -> JSON -> Паркет.

Однако я понятия не имею, как конвертировать эти файлы BSON в JSON, я попробовал bson.decode_file_iter () из Pymongo, он возвращает генератор, я не знаю, что с этим делать.

<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"]

EDIT: я попытался перебрать генератор и получил следующую ошибку:

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 голосов
/ 29 мая 2018

Да, bson.decode_file_iter () ( документация ) возвращает генератор, поскольку файл дампа bson может быть огромным.Вы можете перебрать генератор, чтобы получить каждую строку в качестве dict (значение по умолчанию для аргумента 'as_class' функции), где имена столбцов - это ключи, а значения - соответствующие значения этой строки.

Toпреобразовав 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')

Но на самом деле это будет соответствовать размеру оперативной памяти.Если дамп большой, json_list займет все пространство памяти.Я предпочел бы написать это в файле построчно.

Специально, когда вы интересуетесь паркетом (скорее экосистемой Hadoop), я предполагаю, что вы имеете дело с большими данными.Вы можете попробовать выполнить bson-> json-> Parquet в пакетном режиме, сохраняя количество строк, добавленных в список, для вывода в виде json.

...