在Databricks中使用Scala实现行列转置时Pivot函数无效的问题求助
问题分析与解决方案
嘿,你这是把Pivot和Unpivot的用法搞反啦!Pivot是用来把行里的不同值转成新列的(列转行),而你想要的是把多列(比如B08007e1、B08007m1这些)拆成attribute和value的行结构,这属于**逆透视(Unpivot)**操作,Spark里得用stack函数来实现,而不是Pivot。
先说说你代码里的问题:
- 你用
groupBy("B08007e1")完全搞错了分组字段,应该按Census_block_group来保留这个维度 - Pivot的用法完全不符合你的需求,而且你只执行了groupBy和pivot,没有后续的聚合操作(比如sum),所以Spark根本没做任何实质转换,返回的还是原DataFrame,自然看起来没变化
正确的实现代码
用Spark SQL的stack函数来实现逆透视,刚好匹配你想要的输出格式:
import org.apache.spark.sql.functions._ // 先确保DataFrame的列名正确(如果原表列名是大写的话,注意大小写匹配) val df = censusBlocks.toDF("Census_block_group", "B08007e1", "B08007m1", "B08007e2", "B08007m2") // 用stack函数把4个属性列拆成attribute和value行 val unpivotedDF = df.select( col("Census_block_group"), stack(4, "B08007e1", col("B08007e1"), "B08007m1", col("B08007m1"), "B08007e2", col("B08007e2"), "B08007m2", col("B08007m2") ).alias("attribute", "value") ) // 查看结果 display(unpivotedDF)
代码解释:
stack(4, ...)里的4代表你要转换的属性列总数(这里是4个)- 每一组
"属性名", col("列名")对应把原列转成一行的attribute和value - 最后用
alias给新生成的两列命名为你想要的attribute和value
执行这段代码后,你就能得到和期望格式一致的结果啦!
内容的提问来源于stack exchange,提问作者Leo Bogod
相关产品推荐
相关产品推荐

