Подтвердить что ты не робот

Индекс в паркет

Я хотел бы иметь возможность делать запрос быстрого диапазона в таблице Parquet. Количество возвращаемых данных очень мало по сравнению с общим размером, но поскольку полное сканирование столбцов должно выполняться, оно слишком медленно для моего использования.

Использование индекса решит эту проблему, и я прочитал, что это должно было быть добавлено в Parquet 2.0. Однако я не могу найти никакой другой информации об этом, поэтому я предполагаю, что это не так. Я не думаю, что были бы какие-то фундаментальные препятствия, препятствующие добавлению (многоколоночных) индексов, если бы данные были отсортированы, что в моем случае это.

Мой вопрос: когда будут добавлены индексы к Паркету и каков будет проект высокого уровня для этого? Я думаю, что я уже был бы доволен указателем, который указывает правильный раздел.

С уважением,

Сьерд.

4b9b3361

Ответ 1

Паркет в настоящее время сохраняет статистику min/max для каждой страницы данных. Страница данных представляет собой группу из ~ 1 МБ значений (после кодирования) для одного столбца; несколько страниц составляют фрагменты столбцов паркета.

Эти значения min/max используются для фильтрации как столбцов столбцов, так и страниц, составляющих кусок. Таким образом, вы должны усовершенствовать свое время запроса, сортируя записи по столбцам, на которые хотите отфильтровать, а затем записывать данные в паркет. Таким образом, вы получаете максимальную отдачу от фильтрации статистики.

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

Ответ 2

Обновление Дек /2018:

Parquet Format версии 2.5 добавлены индексы столбцов.

https://github.com/apache/parquet-format/blob/master/CHANGES.md#version-250

См. Https://issues.apache.org/jira/browse/PARQUET-1201 для списка подзадач для этой новой функции.

Обратите внимание, что эта функция только что слилась в формат Паркета, потребуется некоторое время для разных бэкэнд (Spark, Hive, Impala и т.д.), Чтобы начать ее поддерживать.

Эта новая функция называется индексами столбцов. В основном паркет добавил две новые структуры в паркетную разметку - индекс столбца и индекс смещения.

Ниже приведено более подробное техническое объяснение того, что он решает и как.

Постановка задачи

В текущем формате Статистика хранится для ColumnChunks в ColumnMetaData и для отдельных страниц внутри структур DataPageHeader. При чтении страниц читателю необходимо обработать заголовок страницы, чтобы определить, можно ли пропустить страницу на основе статистики. Это означает, что читатель должен получить доступ ко всем страницам в столбце, таким образом, вероятно, прочитав большую часть данных столбца с диска.

цели

Обеспечьте как сканирование диапазонов, так и поиск точек входов/выходов, позволяя прямой доступ к страницам на основе их минимальных и максимальных значений. Особенно:

  1. Однострочный поиск в группе строк, основанный на столбце сортировки этой группы строк, будет считывать только одну страницу данных за полученный столбец. Сканирование диапазонов в столбце сортировки будет необходимо только для чтения точных страниц данных, содержащих соответствующие данные.
  2. Сделайте другие выборочные проверки эффективности ввода-вывода: если у нас есть очень избирательный предикат в столбце не сортировки, для других извлеченных столбцов нам нужно будет только получить доступ к страницам данных, содержащим соответствующие строки.
  3. Никаких дополнительных усилий по декодированию для сканирования без выборочных предикатов, например, групповых сканирований. Если читатель определяет, что ему не нужно читать данные индекса, он не несет никаких накладных расходов.
  4. Страницы индексов для отсортированных столбцов используют минимальное хранилище, сохраняя только граничные элементы между страницами.

Non-цели

Поддержка эквивалента вторичных индексов, т.е. Структура индекса, отсортированная по ключевым значениям по не отсортированным данным.

Технический подход

Мы добавляем две новые структуры столбцов в метаданные группы строк: ColumnIndex: это позволяет перемещаться по страницам столбца на основе значений столбцов и используется для поиска страниц данных, содержащих совпадающие значения для сканирующего предиката OffsetIndex: это позволяет осуществлять навигацию по и используется для извлечения значений для строк, идентифицированных как совпадения через ColumnIndex. Когда строки столбца пропущены, соответствующие строки в других столбцах должны быть пропущены. Следовательно, OffsetIndexes для каждого столбца в RowGroup хранятся вместе.

Новые структуры индексов хранятся отдельно от RowGroup, рядом с нижним колонтитулом, так что читателю не нужно оплачивать затраты ввода-вывода и десериализации для их чтения, если он не выполняет выборочное сканирование. Расположение и длина структур индексов хранятся в столбцах ColumnChunk и RowGroup.

Команда Cloudera Impala провела несколько тестов по этой новой функции (пока недоступной как часть основного продукта Apache Impala). Здесь их улучшения производительности:

HDFS I/O in Bytes

а также

Scanner CPU time in ms

Как вы можете видеть, некоторые из запросов значительно улучшились как по времени процессора, так и по количеству данных, которые он должен был читать с дисков.

Оригинальный ответ с 2016 года:

struct IndexPageHeader {
  /** TODO: **/
}

https://github.com/apache/parquet-format/blob/6e5b78d6d23b9730e19b78dceb9aac6166d528b8/src/main/thrift/parquet.thrift#L505

Заголовок индекса пока не реализован.

См. Исходный код формата Паркета выше. Я не вижу его даже в Parquet 2.0.

Но да - отличный ответ от Райана Блю над Паркетом, что он обладает возможностями псевдоиндексации (фильтры цветения).

Отличный документ о том, как фильтровать цветение Паркета и работать с предикатом, https://www.slideshare.net/RyanBlue3/parquet-performance-tuning-the-missing-guide более технический документ, специфичный для реализации - https://homepages.cwi.nl/~ boncz/MSc/2018-BoudewijnBraams.pdf