element_at:获取数组/Map 元素
速查结论
element_at(array, index) / element_at(map, key) 是 Spark SQL 中用于获取数组指定索引元素或 Map 指定 key 值的函数。索引从 1 开始。与 try_element_at 的区别:索引越界且 spark.sql.ansi.enabled=true 时会抛出异常。
语法
-- 数组取值
element_at(array, index)
-- Map 取值
element_at(map, key)
参数说明
数组用法:
| 参数 | 说明 |
|---|---|
array | 数组表达式 |
index | 从1开始计数的索引。0 会报错。负数表示从末尾向前 |
Map 用法:
| 参数 | 说明 |
|---|---|
map | Map 表达式 |
key | 要查找的键 |
返回值:
- 数组:指定索引处的元素。索引越界时,ANSI 模式下抛异常,非 ANSI 模式返回 NULL
- Map:指定 key 对应的 value。key 不存在时返回 NULL
Since: 2.4.0
示例
数组取值
-- 获取索引 2 的元素
SELECT element_at(array(1, 2, 3), 2);
-- 结果: 2
-- 负数索引:从末尾向前
SELECT element_at(array(1, 2, 3), -1);
-- 结果: 3
Map 取值
-- 获取 key=2 的 value
SELECT element_at(map(1, 'a', 2, 'b'), 2);
-- 结果: b
element_at vs try_element_at 对比
| 函数 | 索引越界(ANSI 模式) | key 不存在 | 适用场景 |
|---|---|---|---|
element_at | 抛异常 | 返回 NULL | 数据规整、索引保证有效 |
try_element_at | 返回 NULL | 返回 NULL | 数据不规整,安全优先 |
-- element_at: 索引越界在 ANSI 模式下会报错
SET spark.sql.ansi.enabled=true;
SELECT element_at(array(1, 2, 3), 10);
-- 报错: ArrayIndexOutOfBoundsException
-- try_element_at: 始终返回 NULL
SELECT try_element_at(array(1, 2, 3), 10);
-- 结果: NULL
选型建议:
- 数据规整、索引必然有效:用
element_at - 数据不规整、索引可能越界:用
try_element_at
常见报错与避坑指南
索引 0 始终报错
数组索引从 1 开始,索引 0 在任何模式下都会报错。
-- 错误写法:索引必须是 1-based
SELECT element_at(array(1, 2, 3), 0);
-- 报错: SQL Array indices start at 1, got 0
-- 正确写法
SELECT element_at(array(1, 2, 3), 1);
-- 结果: 1
ANSI 模式下的越界行为
spark.sql.ansi.enabled 配置会影响越界行为,在生产环境中需注意配置一致性。
-- 非 ANSI 模式(默认):越界返回 NULL
SET spark.sql.ansi.enabled=false;
SELECT element_at(array(1, 2, 3), 10);
-- 结果: NULL
-- ANSI 模式:越界抛异常
SET spark.sql.ansi.enabled=true;
SELECT element_at(array(1, 2, 3), 10);
-- 报错
📱关注公众号
「数据仓库技术」文章同步更新,不错过每一篇干货

💬加群交流
备注「数据仓库技术」加入社群,每日一道大厂SQL真题
