Как заставить Афину / Престо распознать индекс паркета?

1

У меня есть файл паркета размером 25 тыс. Строк (всего 469,5 килобайта), где каждый элемент паркета имеет уникальный целочисленный идентификатор. Зная это, я поместил индекс в этот столбец, но он не показывает, что индексирование столбца фактически влияет на производительность при использовании athena (aws service)/prestodb (базовый движок). Я пытаюсь сделать простой выбор, где я хочу вытащить одну из строк id-

SELECT *
FROM widgets w
WHERE w.id = 1

Столбец id проиндексирован, поэтому, как только prestodb находит это совпадение, он не должен делать никакого дальнейшего сканирования. Столбец также упорядочен, поэтому он должен иметь возможность выполнять двоичный поиск, чтобы разрешить местоположение вместо немого сканирования.

Я могу сказать, правильно ли используется индекс, поскольку athena возвращает количество байтов, отсканированных в операции. С индексом и без него athena возвращает размер байта самого файла в качестве размера сканирования, то есть сканирует весь файл. Чтобы быть уверенным, что заказ, чтобы идентификатор был самой первой строкой, также не повлиял.

Разве это невозможно в текущей версии athena/prestodb? Я использую python, pandas и pyarrow.

  • 0
    Как (с каким компонентом) вы создали индекс?
Теги:
pandas
prestodb
parquet
amazon-athena

1 ответ

2
Лучший ответ

Вы не указали, как вы создали индекс, я предполагаю, что вы говорите об индексе Hive. Согласно 1 и 2, Presto не поддерживает индексы улья. Согласно 3, Hive сам отказался от поддержки для них в Hive 3.

Это отвечает на ваш вопрос относительно того, почему присутствие индекса не влияет на то, как Presto выполняет запрос. Итак, какие другие способы ограничить объем данных, которые необходимо обработать?

  • Метаданные паркета включают минимальные и максимальные значения для каждой группы строк для каждого столбца. Если в таблице есть несколько групп строк, будут прочитаны только те, которые могут быть сопоставлены.
  • Предстоящая функция PARQUET-1201 добавит индексы уровня страницы к самим файлам Parquet.
  • Если вы запрашиваете определенные столбцы, будут прочитаны только те столбцы.
  • Если ваша таблица разделена на разделы, фильтрация для столбца "раздел за" будет читать только этот раздел.

Обратите внимание, однако, что все эти меры имеют смысл только для размеров данных, превышающих 500KB. Фактически, сам Паркет является излишним для таких маленьких столов. Размер по умолчанию для группы строк составляет 128 МБ, и ожидается, что у вас будет много групп строк.

  • 0
    Спасибо тебе за это. Я думаю, я просто пытаюсь сказать prestodb, что конкретный столбец является уникальным, и как только он находит совпадение, ему не нужно запрашивать дальше. Я делаю накопления на наборе данных, который намного больше (30 ГБ), и беру результаты этого и объединяюсь в размерные поля (имя виджета и т. Д.). Я еще не делал никаких разделов, но это был бы мой следующий шаг. Так есть ли какой-нибудь способ, кроме как пометить колонку в паркете как уникальную ?
  • 2
    У Hive 3.0 будет UNIQUE (HIVE-16575), но Presto, вероятно, пока не поддерживает это. Вы можете попытаться добавить LIMIT 1 к своим запросам, чтобы они прекратились после того, как найдено совпадение, но это в лучшем случае сэкономит вам в среднем 50% времени (есть также постоянные затраты).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню