Запись потока больших данных в Parquet с Python - PullRequest
0 голосов
/ 30 мая 2019

Я хочу записать поток больших данных в файл паркета с Python. Мои данные огромны, и я не могу сохранить их в памяти и записать за один раз.

Я нашел две библиотеки Python (Pyarrow, Fastparquet), которые могли читать и писать в файле Parquet. Это решение, которое я использую Pyarrow, но я рад попробовать другую библиотеку, если вы знаете рабочее решение:

import pandas as pd
import random
import pyarrow as pa
import pyarrow.parquet as pq


def data_generator():
    # This is a simulation for my generator function
    # It is not allowed to change the nature of this function
    options = ['op1', 'op2', 'op3', 'op4']
    while True:
        dd = {'c1': random.randint(1, 10), 'c2': random.choice(options)}
        yield dd


result_file_address = 'example.parquet'
index = 0

try:
    dic_data = next(data_generator())
    df = pd.DataFrame(dic_data, [index])
    table = pa.Table.from_pandas(df)
    with pq.ParquetWriter(result_file_address, table.schema,
                          compression='gzip', use_dictionary=['c1', 'c2']
                          ) as writer:
        writer.write_table(table)
        for dic_data in data_generator():
            index += 1
            df = pd.DataFrame(dic_data, [index])
            table = pa.Table.from_pandas(df)
            writer.write_table(table=table)
except StopIteration:
    pass
finally:
    del data_generator

У меня есть следующие проблемы с вышеуказанным кодом:

  • Все данные накапливаются в ОЗУ и в конце процесса запишут на диск, что для меня нецелесообразно из-за ограничения размера ОЗУ.
  • Я могу значительно уменьшить размер конечных результатов с помощью 7zip. Кажется, сжатие не работает.
  • Я получаю следующее предупреждение от использования use_dictinary:
Traceback (most recent call last):
  File "stringsource", line 15, in string.from_py.__pyx_convert_string_from_py_std__in_string
TypeError: expected bytes, str found
Exception ignored in: 'pyarrow._parquet.ParquetWriter._set_dictionary_props'
Traceback (most recent call last):
  File "stringsource", line 15, in string.from_py.__pyx_convert_string_from_py_std__in_string
TypeError: expected bytes, str found

Большое спасибо заранее

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...