如何使用Spark SQL从数组列中获取指定task_type对应的task_due_date
直接获取Spark SQL数组中指定元素的字段值
不需要展开数组再关联,用Spark SQL的高阶数组函数就能直接实现,下面是两种常用场景的写法:
场景1:列X已经是结构化数组类型(array)
如果你的X列已经被解析成array<struct<task_type:string, task_due_date:string>>类型,直接用filter+element_at组合提取:
SELECT -- 过滤出task_type为sizeScale的元素,取第一个后提取到期日期 element_at(filter(X, t -> t.task_type = 'sizeScale'), 1).task_due_date AS sizeScale_due_date FROM your_table
逻辑说明:
filter(X, t -> t.task_type = 'sizeScale'):遍历数组X,筛选出所有task_type等于sizeScale的元素,返回一个新的数组element_at(..., 1):取筛选后数组的第一个元素(如果确保每个task_type唯一,直接取第一个即可)- 最后通过
.直接提取该元素的task_due_date字段
场景2:列X是JSON字符串类型
如果X存储的是原始JSON字符串,需要先通过from_json解析成结构化数组,再用上面的逻辑:
SELECT element_at( filter( -- 先把JSON字符串解析成结构化数组 from_json(X, 'array<struct<task_type:string, task_due_date:string>>'), t -> t.task_type = 'sizeScale' ), 1 ).task_due_date AS sizeScale_due_date FROM your_table
补充说明:
如果数组中存在多个task_type为sizeScale的元素,可以根据需求调整:
- 取所有对应的日期:用
transform(filter(...), t -> t.task_due_date)返回日期数组 - 取最新/最早日期:结合
max/min函数,比如max(element_at(filter(...), 1).task_due_date)
内容的提问来源于stack exchange,提问作者ravi teja Puppala
相关产品推荐
相关产品推荐

