Я хочу записать поток больших данных в файл паркета с 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
Большое спасибо заранее