Избегайте вычисления одного и того же значения несколько раз в Presto - PullRequest
0 голосов
/ 02 июля 2019

Пример таблицы:

╔═══════════════╗
║ dummy_data    ║
╠═══════════════╣
║ XXX_1234_YYYY ║
║ XXX_5678_YYYY ║
║ XXX_9101_YYYY ║
╚═══════════════╝

Желаемый вывод:

╔═══════════════╦═════════════╦═════════════╗
║  dummy_data   ║ with_prefix ║ with_suffix ║
╠═══════════════╬═════════════╬═════════════╣
║ XXX_1234_YYYY ║ Pre_1234    ║ 1234_Suf    ║
║ XXX_5678_YYYY ║ Pre_5678    ║ 5678_Suf    ║
║ XXX_9101_YYYY ║ Pre_9101    ║ 9101_Suf    ║
╚═══════════════╩═════════════╩═════════════╝

В настоящее время я пытаюсь написать Presto Query для использования на Amazon Athena,

select
    dummy_data,
    'Pre_' || split(dummy_data,'_')[2] as with_prefix,
    split(dummy_data,'_')[2] || '_Suf' as with_suffix
from dummy_table

Приведенный выше запрос приводит к тому, что split(dummy_data,'_')[2] вычисляется два раза.Есть ли способ избежать двойного вычисления?Также Presto выясняет, что это то же самое вычисление и избегает повторного вычисления?

Я пытаюсь избежать использования подзапроса или С предложением .

1 Ответ

2 голосов
/ 02 июля 2019

В настоящее время Presto не снимает дедупликацию вычислений подвыражения. Я создал запрос функции для этого: https://github.com/prestosql/presto/issues/1070. Вы можете увидеть, что выражение вычисляется более одного раза, проверив вывод EXPLAIN (см. Проблему, например).

Как вы знаете, вы можете принудительно дедуплицировать, используя встроенное представление:

SELECT
    dummy_data,
    'Pre_' || sub_data  AS with_prefix,
    sub_data || '_Suf' AS with_suffix
FROM (
    SELECT
        dummy_data, 
        split(dummy_data,'_')[2] AS sub_data
    FROM (VALUES 'XXX_1234_YYYY') t(dummy_data)
);
...