array_intersect дает проблему с производительностью в presto - PullRequest
0 голосов
/ 11 октября 2019

У меня есть запрос, выполняющийся в presto, который имеет условие array_intersect. Это займет около 5 часов, чтобы бежать. Если я удалю array_intersect, то это займет меньше часа.

CARDINALITY(ARRAY_INTERSECT(links, ARRAY['504949547', '504949616', '515604515', '515604526', '515604527', '515604528'])) > 0

Может кто-нибудь, пожалуйста, дайте мне знать, как улучшить производительность. Требуется получить его менее чем за 5 минут.

Попытался включить разливной диск, но это не помогло. Размер входных данных составляет около 1 ТБ.

Спасибо

1 Ответ

1 голос
/ 11 октября 2019

array_intersect материализует результат (пересечение), тогда как единственное, что вы проверяете, - это членство в определенных предопределенных элементах. В этом случае я бы рекомендовал использовать any_match.

any_match(links, e -> e IN ('504949547', '504949616', ...))

Если вы используете версии Presto, которые не имеют any_match,Вы можете использовать reduce:

reduce(
    links, -- array to reduce
    false, -- initial state
    (s, e) -> s OR e IN ('504949547', '504949616', ...), -- reduction function
    s -> s) -- output function

Попытался включить разливной диск, но это не помогло.

Примечание: В Presto разлив поддерживается для определенных операторов (большинство функций «Объединения», «Агрегирование», «По порядку», «Окно»). Это не относится к скалярным функциям, работающим на ARRAY s. Также не стоит ожидать разлива повышения производительности . Это может только уменьшить объем памяти при стоимости производительности.

...