如何在Spark中对两组列执行Unpivot(逆透视)操作?
解决Spark中多组列同时Unpivot的高效方案
Spark不允许在同一个selectExpr里使用多个生成器函数(比如stack),所以你之前的写法会报错。想要高效完成多组列的逆透视,不需要分两次处理再关联,直接用单个stack函数整合所有需要转换的列即可。
方法一:使用stack一次性生成所有列
把每个时间段对应的sales和customers字段打包到stack的参数里,一次展开就能得到目标结构:
unpivotedDf = df.selectExpr( "date", "stack(2, 'day', sales_day, customers_day, 'night', sales_night, customers_night) as (timeOfDay, sales, customers)" )
这里stack(2, ...)的第一个参数是要展开的行数(这里是day和night两组),后面依次是每组的timeOfDay值、对应的sales列、对应的customers列,最后指定别名映射到目标列名。
方法二:使用Spark SQL的UNPIVOT语法(Spark 3.0+)
如果你的Spark版本在3.0及以上,也可以用更直观的UNPIVOT语法来实现:
unpivotedDf = df.createOrReplaceTempView("sales_data") unpivotedDf = spark.sql(""" SELECT date, timeOfDay, sales, customers FROM sales_data UNPIVOT ( (sales, customers) FOR timeOfDay IN ( (sales_day, customers_day) AS 'day', (sales_night, customers_night) AS 'night' ) ) """)
这两种方法都是单次数据转换,避免了关联操作带来的性能损耗,完全适配大数据集的处理需求。
内容的提问来源于stack exchange,提问作者EmilioGarzaC
相关产品推荐
相关产品推荐

