如何优化Athena中重复使用split_part的查询以提升速度?
Athena查询优化:减少split_part重复调用提升性能
当然可以优化,而且方法很直接——把KEY一次性拆分成数组,后续直接通过数组下标取对应元素就行,避免重复拆分字符串带来的额外计算开销。
优化后的查询语句如下(用子查询先完成一次拆分):
SELECT key_parts[1] AS serviceid, key_parts[2] AS eventtype, CAST(date_parse(concat(key_parts[3], '-', key_parts[4], '-', key_parts[5]), '%Y-%m-%d') AS DATE) AS createTime FROM ( SELECT split(KEY, '/') AS key_parts FROM TEST2 WHERE dt = '2023-05-24-01-00' AND cardinality(split(KEY, '/')) > 5 ) AS split_keys;
或者用CTE(公共表表达式)写法,可读性更好:
WITH split_keys AS ( SELECT split(KEY, '/') AS key_parts FROM TEST2 WHERE dt = '2023-05-24-01-00' AND cardinality(split(KEY, '/')) > 5 ) SELECT key_parts[1] AS serviceid, key_parts[2] AS eventtype, CAST(date_parse(concat(key_parts[3], '-', key_parts[4], '-', key_parts[5]), '%Y-%m-%d') AS DATE) AS createTime FROM split_keys;
优化原理
原查询中每次调用split_part都会重新对KEY字符串执行一次拆分操作,多次调用就会产生重复计算。上面的写法只在子查询/CTE中执行一次split(KEY, '/')将字符串拆分为数组,后续所有字段提取都直接访问数组的对应下标(Athena数组下标从1开始,和split_part的参数逻辑一致),彻底避免了重复拆分的开销,能有效提升查询速度。
内容的提问来源于stack exchange,提问作者sclee1
相关产品推荐
相关产品推荐

