跳到主要内容

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 用法

参数说明
mapMap 表达式
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真题

交流微信二维码

你可能还想看