Могу ли я получить доступ к файлу Parquet через индекс, не считывая весь файл в память?

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

Возможно ли такое поведение при поиске в файлах Parquet без Java (решения, отличные от pyspark)? Я использую Parquet из-за сильной поддержки dtype.

import h5py

f = h5py.File('my_file.hdf5', 'w')
dset = f.create_dataset('coords', data=my_ndarray)
f.close()

f = h5py.File('my_file.hdf5', 'r')
dset = f['coords']
my_array = dset[-2:]

https://arrow.apache.org/docs/python/parquet.html#inspecting-the-parquet-file-metadata

Я вижу здесь, что метаданные Parquet имеют num_row_groups: 1 (or more). Но я не уверен, как это поможет мне получить строки [23, 42, 117, 99293184].


person HashRocketSyntax    schedule 16.02.2021    source источник
comment
Конечно, вы можете записать метаданные в файл паркета и использовать эти метаданные для индексации определенной группы строк, содержащей нужные вам данные.   -  person Mansoor    schedule 16.02.2021
comment
Я немного не уверен, что вы ищете. Вы спрашиваете, в паркете поддерживается произвольный доступ? Например, вы не используете HDF5 и вам нужны аналогичные возможности?   -  person Pace    schedule 16.02.2021
comment
Или вы спрашиваете, достаточно ли хорош произвольный доступ HDF5 для поддержки моделей частичного чтения parquet? Например, вы храните паркетные файлы в хранилище HDF5.   -  person Pace    schedule 16.02.2021
comment
@Pace да, я хочу получить список строк из паркета   -  person HashRocketSyntax    schedule 16.02.2021


Ответы (1)


Паркет допускает некоторые формы частичного/произвольного доступа. Однако он ограничен. Каждый файл паркета состоит из одной или нескольких групп строк, а каждый файл паркета состоит из одного или нескольких столбцов. Вы можете получить любую комбинацию групп строк и столбцов, которую вы хотите.

Есть только один способ хранения столбцов в паркетном файле. Однако то, как распределить строки по группам строк, зависит от создателя файла. Создатель может поместить каждую строку в отдельную группу строк (хотя это было бы слишком неэффективно) или использовать одну группу строк для всего файла (это довольно распространено).

Это означает, что возможность частичного чтения будет зависеть от того, как был создан файл. Если вы создаете файлы и заранее знаете, какие виды чтения будут выполняться для доступа к данным, вы можете использовать это для создания групп строк. Если вы не знаете шаблоны доступа заранее или не контролируете создание файлов, которые вы читаете, вам, вероятно, придется считывать весь файл в память и фильтровать позже.

Другой распространенный сценарий — хранить один большой набор данных во многих файлах (чтобы некоторые строки находились в каждом файле). Это обеспечивает такое же поведение частичного чтения, которое вы имели бы из нескольких групп строк. Однако иногда проще управлять несколькими файлами.

И pyarrow, и fastparquet должны предоставить вам API для фильтрации групп строк. Они также предоставляют метаданные файла паркета, чтобы вы могли самостоятельно получить доступ к информации метаданных для реализации некоторого пользовательского механизма фильтрации.

person Pace    schedule 16.02.2021