Я пытаюсь создать файл паркета из сильно нормализованной базы данных SQL со схемой «снежинка». Некоторые измерения имеют очень длинные текстовые атрибуты, поэтому простое выполнение большого набора объединений для денормализации данных, передаваемых в PyArrow, занимает некоторое время даже при небольшом наборе данных (десятки тысяч фактов) и создает файл .parquet примерно в 10 раз больше, чем исходный файл Sqlite. Например:
Код: Выделить всё
import pandas as pd
import pyarrow as pa
...
qry = """
SELECT *
FROM dim1
JOIN dim2 using (d1_id)
JOIN dim3 using (d1_id)
JOIN dim4 using (d2_id)
JOIN facts using (d1_id, d2_id, d3_id, d4_id)
"""
df = pd.read_sql_query(qry, conn)
t = pa.Table.from_pandas(df)
В качестве обходного пути я прибег к чтению каждой таблицы базы данных отдельно, созданию соответствующей pyarrow.Table, затем преобразованию столбцов для больших атрибутов в словарные типы и только затем объединению всего этого с таблицей фактов.
Код: Выделить всё
d1 = pd.read_sql_query("SELECT * FROM dim1", conn);
d1 = d1.set_column(4, "long_attr", d1.column('long_attr').dictionary_encode())
...
t = d1.join(d2, keys=["d1_id"]).join(d3, keys=["d1_id"]), ...)
t
Это работает хорошо, но довольно утомительно, поскольку я конвертирую каждый текстовый столбец в таблицах измерений по одному. Есть ли лучший способ сделать это? Кажется, это обычная задача управления данными, поэтому я ожидаю существования более общего или, по крайней мере, стандартного решения.