#apache-spark #hive #apache-spark-sql #hiveql #dremio
Вопрос:
У меня есть внешняя таблица hive (файлы s3, хранящиеся в формате parquet), созданная с помощью spark размером около 30 ГБ и несколькими сотнями разделов. Однако мне нужно запросить данные в столбце, не являющемся разделом (скажем, SUPPLIER_ID), чтобы просмотреть полную историю транзакций, но не относящуюся к периоду или дате (столбцы разделов). Как я могу обеспечить этот шаблон запроса, если я не уверен, к какому разделу принадлежат данные в таблице-улье?
Комментарии:
1. просто не фильтруйте по разделам и не включайте разделы в groupby
2. это приведет к принудительному сканированию всей таблицы, и ее запрос может даже не быть завершен
3. Посмотрите на мой ответ
Ответ №1:
При фильтрации результатов запроса пользователь API parquet-mr (например, Hive или Spark) может извлекать все записи из API, а затем оценивать каждую запись по предикатам условия фильтрации. Однако для этого требуется собрать все записи в памяти, даже не совпадающие. При нажатии на предикат эти условия передаются в библиотеку parquet-mr, которая оценивает предикаты на более низком уровне и удаляет несоответствующие записи без их предварительной сборки.
Например, при оценке записи {название: «Звездная ночь», ширина: 92, высота: 74} по условию высота > 80 нет необходимости собирать всю запись целиком, поскольку ее можно отбросить исключительно на основе ее атрибута высоты. Однако, хотя условие высота > ширина также не соответствует записи, в этом случае нельзя использовать выпадающий список предикатов, поскольку для оценки предиката нам нужно несколько полей одной и той же записи.
Кроме того, pushdown предикатов также позволяет отбрасывать целые группы строк, которые не могут содержать совпадений, на основе их минимальной/максимальной статистики. Например, если статистика группы строк включает {min: 62, max: 78} для столбца высота, а условие фильтрации-высота > 80, то ни одна из записей в этой группе строк не может совпадать, поэтому вся группа строк может быть отброшена.
Просто напишите запрос, и у Parquet будет несколько умных навыков, перечисленных выше. Он может пропускать различные группы и использовать столбчатое хранилище для проверки, что намного быстрее, чем чтение / десериализация всей строки.
Комментарии:
1. спасибо блефантому. похоже, что для данной ситуации достаточно иметь паркетные файлы. Но я не вижу лучшей производительности, если вы не включите раздел col в фильтр. Существуют ли какие-либо контрольные показатели или ссылки, которые мы можем сопоставить с базовым объемом данных и ожидаемым временем выполнения запроса
2. вам придется показать запрос, так как я нахожу это странным