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

