LATERAL VIEW POSEXPLODE ~ Hive/Spark SQL

LATERAL VIEW POSEXPLODE ~ Hive/Spark SQL 背景LATERAL VIEW侧视图用来将数组 / Map 等集合字段炸开多行实现一对多关联posexplode()爆炸函数和 explode 类似但同时返回下标位置 元素值LATERAL VIEW posexplode(数组字段) AS pos, val作用把数组拆成多行额外带出每个元素在数组中的索引下标explode vs posexplode 核心区别explode(arr)只输出数组里的元素没有下标explode(array(a,b,c))ASval结果val a b cposexplode(arr)输出两列pos下标从 0 开始、val元素posexplode(array(a,b,c))ASpos,val结果pos val 0 a 1 b 2 cLATERAL VIEW 作用如果直接 select posexplode(col)只能单独查爆炸函数当需要同时查询原表普通字段 炸开后的多行数据必须搭配 LATERAL VIEW标准语法模板SELECT原表普通字段,pos,-- 数组下标val-- 数组元素FROM表名 LATERALVIEWposexplode(数组字段)tmpASpos,val;tmp侧视图别名可省略建议写上pos自定义下标列名val自定义元素列名实战示例id name hobby_list 1 小明 [篮球,游戏] 2 小红 [看书,画画,跑步]SELECTid,name,pos,hobbyFROMuser_info LATERALVIEWposexplode(hobby_list)tASpos,hobby;输出结果id name pos hobby 1 小明 0 篮球 1 小明 1 游戏 2 小红 0 看书 2 小红 1 画画 2 小红 2 跑步常见使用场景需要区分数组元素顺序比如日志数组按时间有序pos 代表第几条行为取数组第 N 个元素做过滤-- 只保留数组第一个元素pos0WHEREpos0有序数组转宽表根据 pos 做行转列 collect_list case when posx有序标签打分下标越小权重越高pos 参与计算。关键特性 坑点下标从 0 开始不是 1数组为 null / [] 空数组整条行会消失不生成任何行想保留空行用LATERALVIEWOUTERposexplode(...);支持嵌套多个 LATERAL VIEW 连续写拆解多层数组Map 类型配套posexplode(map) 会返回 pos, key, value 三列OUTER 关键字补充保留空数据不加 OUTER数组为空则主表这条数据直接丢失加 OUTER数组为空时 posnull, valnull主表数据保留LATERALVIEWOUTERposexplode(hobby_list)tASpos,hobby