如何在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
相关产品推荐
相关产品推荐

