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

如何在Spark SQL或PySpark中合并多列数据至单列(无需UNION ALL)

问题:能否无需使用UNION ALL实现列转行需求?

现有包含Cat、ID、V1、V2列的表,输入数据如下:

CatIDV1V2
A1AAAA
A1NULLBB
C3AANULL
C3NULLBB

期望输出格式为:

CatIDV
A1AA
A1AA
A1BB
C3AA
C3BB

请问能否无需使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 02:01:11