如何在Spark SQL或PySpark中合并多列数据至单列(无需UNION ALL)
问题:能否无需使用UNION ALL实现列转行需求?
现有包含Cat、ID、V1、V2列的表,输入数据如下:
| Cat | ID | V1 | V2 |
|---|---|---|---|
| A | 1 | AA | AA |
| A | 1 | NULL | BB |
| C | 3 | AA | NULL |
| C | 3 | NULL | BB |
期望输出格式为:
| Cat | ID | V |
|---|---|---|
| A | 1 | AA |
| A | 1 | AA |
| A | 1 | BB |
| C | 3 | AA |
| C | 3 | BB |
请问能否无需使用UNION ALL实现该需求?
当然可以,不用UNION ALL也能实现这类列转行需求,不同数据库有对应的实现方式,以下是几种常见方案:
1. 支持VALUES子句的数据库(SQL Server、PostgreSQL、MySQL 8.0+等)
通过CROSS JOIN配合VALUES子句将多列拆成行,再过滤空值:
SELECT t.Cat, t.ID, v.V FROM 你的表名 t CROSS JOIN (VALUES (t.V1), (t.V2)) AS v(V) WHERE v.V IS NOT NULL;
逻辑是把每行的V1、V2转为两个独立行值,通过交叉连接展开,最后剔除空值即可得到目标结果。
2. PostgreSQL专属:UNNEST函数
利用数组和UNNEST函数直接拆分列:
SELECT t.Cat, t.ID, v.V FROM 你的表名 t LATERAL UNNEST(ARRAY[V1, V2]) AS v(V) WHERE v.V IS NOT NULL;
3. MySQL 8.0+/Oracle:JSON函数实现
以MySQL为例,将列转为JSON数组后用JSON_TABLE拆分行:
SELECT t.Cat, t.ID, j.V FROM 你的表名 t JOIN JSON_TABLE( JSON_ARRAY(t.V1, t.V2), '$[*]' COLUMNS (V VARCHAR(100) PATH '$') ) j WHERE j.V IS NOT NULL;
这些方案核心思路都是将多列转为集合/数组后拆分为行,全程无需依赖UNION ALL。
内容的提问来源于stack exchange,提问作者Mohit
相关产品推荐
相关产品推荐

