Athena如何获取数组元素索引实现跨列按位置取值
Athena 数组位置匹配实现方案
内置函数直接实现
Athena 没有名为index的数组位置查找内置函数,但提供了功能完全一致的array_position()函数,完全满足需求:
- 函数语法:
array_position(数组列, 目标查找值) - 下标规则:从1开始计数,和
element_at()读取数组的下标规则完全匹配,未找到目标值时返回0
直接替换示例SQL中的index即可得到正确结果:
WITH dataset AS ( SELECT ARRAY ['hello', 'amazon', 'athena'] AS words, ARRAY ['john', 'tom', 'dave'] AS names ) SELECT element_at(words, array_position(names, 'john')) AS john_word FROM dataset
执行返回结果如下,完全符合预期:
| john_word |
|---|
| hello |
复杂场景自定义实现
如果需要支持更灵活的匹配规则(比如忽略大小写、模糊匹配元素等,array_position仅支持精确匹配),可以通过UNNEST ... WITH ORDINALITY语法原生实现,不需要额外开发自定义函数:
WITH dataset AS ( SELECT ARRAY ['hello', 'amazon', 'athena'] AS words, ARRAY ['john', 'tom', 'dave'] AS names ), name_pos_pair AS ( SELECT words, name_item, pos_idx FROM dataset, UNNEST(names) WITH ORDINALITY AS t(name_item, pos_idx) ) SELECT element_at(words, pos_idx) AS john_word FROM name_pos_pair WHERE name_item = 'john' -- 可自定义匹配规则,比如 lower(name_item) = 'john' 实现忽略大小写匹配
这个方案会在展开数组的同时记录每个元素的位置下标,可以根据业务需要自由调整匹配条件,适配更复杂的业务场景。
内容的提问来源于stack exchange,提问作者Memphis Meng
相关产品推荐
相关产品推荐

