Эффективное чтение части секционированного набора данныхPython

Программы на Python
Ответить
Anonymous
 Эффективное чтение части секционированного набора данных

Сообщение Anonymous »

У меня довольно большие (до ~300 ГБ) наборы данных, хранящиеся в разделах в формате паркета (сжатом).
Я пытаюсь найти эффективный способ чтения частей (как определено с помощью набора фильтров) набора данных в pandas.
Сейчас это делается

Код: Выделить всё

result = ds.dataset(dataset_storage_root, format="parquet", partitioning='hive').scanner(
columns=columns,
filter=filters
).to_table().to_pandas()
Хотя это работает, это довольно медленно (я предполагаю, что это связано с тем, что на самом деле он считывает весь набор данных и только затем применяет фильтры, перебирая каждую строку).
И под довольно медленными я подразумеваю ~13 секунд, что нормально, учитывая размер набора данных, но смешно, учитывая фактический объем данных, которые мне нужно получить.
Определение подпапки для данных и чтение вручную только эта часть для сравнения занимает ~9 мс. Обратной стороной является то, что мне нужно вручную добавлять столбцы и значения разделов и обрабатывать немало крайних случаев с помощью фильтрации и схем.
Я предполагаю, что должен быть способ сделать это с помощью API и при этом эффективно.
Что я уже пробовал, к своему разочарованию:

Код: Выделить всё

df_pandas = pd.read_parquet(dataset_storage_root, engine="pyarrow", filters=filters)
Занимает 1 минуту 23 секунды.

Код: Выделить всё

df_pq = pq.read_table(dataset_storage_root, filters=filters)
Занимает 1 минуту 22 секунды.
Это занимает безумное количество времени, несмотря на утверждение, что необходимо читать только подмножество, указанное фильтрами.>

Подробнее здесь: https://stackoverflow.com/questions/791 ... ed-dataset
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»