You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Spark SQL中动态拆分列表为列并以另一列表作为列名

Spark SQL 动态列转换解决方案

实现思路

要在不硬编码列名和索引的前提下完成表结构转换,核心是利用Spark SQL的数组操作与透视功能,步骤如下:

  • 用arrays_zip将names和values数组按位置配对,生成包含键值对的数组列
  • 用explode将数组展开为多行,每行对应一组键值对
  • 通过pivot将原数组中的元素(names值)转为列名,对应values值填充到列中

具体SQL语句

假设原表名为source_table,执行以下SQL即可完成转换:

SELECT *
FROM (
    SELECT explode(arrays_zip(names, values)) AS kv
    FROM source_table
) t
PIVOT (
    MAX(kv.values)
    FOR kv.names IN (SELECT DISTINCT explode(names) FROM source_table)
)

语句说明

  • arrays_zip(names, values):将每行的names和values数组按索引配对,生成类似[{"names":"a","values":1}, {"names":"b","values":2}, ...]的结构体数组
  • explode(...):将上述数组拆分为多行,每行仅包含一组键值对结构体
  • PIVOT子句:以kv.names作为新列名,聚合提取kv.values(此处用MAX是因为每个键在单行仅对应一个值,聚合函数不影响结果);IN子句动态提取所有唯一的列名,彻底避免硬编码操作

内容的提问来源于stack exchange,提问作者Selva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 13:58:44