Запрос несекционированного столбца во всей внешней таблице улья

#apache-spark #hive #apache-spark-sql #hiveql #dremio

Вопрос:

У меня есть внешняя таблица hive (файлы s3, хранящиеся в формате parquet), созданная с помощью spark размером около 30 ГБ и несколькими сотнями разделов. Однако мне нужно запросить данные в столбце, не являющемся разделом (скажем, SUPPLIER_ID), чтобы просмотреть полную историю транзакций, но не относящуюся к периоду или дате (столбцы разделов). Как я могу обеспечить этот шаблон запроса, если я не уверен, к какому разделу принадлежат данные в таблице-улье?

Комментарии:

1. просто не фильтруйте по разделам и не включайте разделы в groupby

2. это приведет к принудительному сканированию всей таблицы, и ее запрос может даже не быть завершен

3. Посмотрите на мой ответ

Ответ №1:

Цитата из: https://docs.cloudera.com/documentation/enterprise/6/6.3/topics/cdh_ig_predicate_pushdown_parquet.html

При фильтрации результатов запроса пользователь API parquet-mr (например, Hive или Spark) может извлекать все записи из API, а затем оценивать каждую запись по предикатам условия фильтрации. Однако для этого требуется собрать все записи в памяти, даже не совпадающие. При нажатии на предикат эти условия передаются в библиотеку parquet-mr, которая оценивает предикаты на более низком уровне и удаляет несоответствующие записи без их предварительной сборки.

Например, при оценке записи {название: «Звездная ночь», ширина: 92, высота: 74} по условию высота > 80 нет необходимости собирать всю запись целиком, поскольку ее можно отбросить исключительно на основе ее атрибута высоты. Однако, хотя условие высота > ширина также не соответствует записи, в этом случае нельзя использовать выпадающий список предикатов, поскольку для оценки предиката нам нужно несколько полей одной и той же записи.

Кроме того, pushdown предикатов также позволяет отбрасывать целые группы строк, которые не могут содержать совпадений, на основе их минимальной/максимальной статистики. Например, если статистика группы строк включает {min: 62, max: 78} для столбца высота, а условие фильтрации-высота > 80, то ни одна из записей в этой группе строк не может совпадать, поэтому вся группа строк может быть отброшена.

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

Комментарии:

1. спасибо блефантому. похоже, что для данной ситуации достаточно иметь паркетные файлы. Но я не вижу лучшей производительности, если вы не включите раздел col в фильтр. Существуют ли какие-либо контрольные показатели или ссылки, которые мы можем сопоставить с базовым объемом данных и ожидаемым временем выполнения запроса

2. вам придется показать запрос, так как я нахожу это странным