避免在Presto中多次计算相同的值

时间:2019-07-02 08:06:12

标签: sql presto amazon-athena

样品表:

╔═══════════════╗
║ 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是否也知道它的计算相同,并且避免了重新计算?

我试图避免使用子查询 With子句

1 个答案:

答案 0 :(得分:2)

当前,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)
);