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

如何在Spark 2 SQL中实现宽表转纵向表

在Spark 2 SQL中实现宽表转纵向表(列转行)的解决方案

嘿,你这个需求就是典型的**宽表转窄表(列转行)**操作,在Spark 2 SQL里有两种实用的实现方式,我给你拆解一下:

方法一:用UNION ALL拼接(适合列数较少的场景)

如果你的列数量不多,这种方式最直观易懂——把每一列单独拆成一条记录,再用UNION ALL合并所有结果:

SELECT ID, 'A' AS Key, A AS Val FROM input_table
UNION ALL
SELECT ID, 'B' AS Key, B AS Val FROM input_table
UNION ALL
SELECT ID, 'C' AS Key, C AS Val FROM input_table
UNION ALL
SELECT ID, 'D' AS Key, D AS Val FROM input_table
ORDER BY ID, Key;

每一条SELECT语句都会提取ID、固定的列名(作为Key)和对应列的值(作为Val),最后合并后排序,就能得到你想要的纵向结构。

方法二:用内置stack()函数(推荐,高效简洁)

Spark SQL提供了专门的stack()函数来处理这类列转行需求,只需要扫描一次表,比UNION ALL更高效,尤其适合列数多的情况:

SELECT 
    ID,
    Key,
    Val
FROM input_table
LATERAL VIEW stack(4, 'A', A, 'B', B, 'C', C, 'D', D) AS Key, Val
ORDER BY ID, Key;

这里的参数解释一下:

  • stack(4, ...)里的4代表我们要转换的列的总数(A、B、C、D共4列)
  • 括号里的参数是成对出现的:第一个是列名(作为Key),第二个是对应的列值(作为Val)
  • LATERAL VIEW的作用是把stack()返回的多行结果展开,把原表的每一行拆成4行,完美匹配你需要的输出结构

内容的提问来源于stack exchange,提问作者K.O.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:02:37