Spark Scala无聚合转置DataFrame求助(Spark 2.1.0)
嘿,我之前在Spark 2.1.0 + Scala的环境里碰到过一模一样的需求,刚好可以给你分享下解决方案!
你的需求是把键值对形式的长表转成宽表,核心可以用Spark的pivot函数来实现,不过因为所有数据最终要合并成一行,需要先做个临时分组。具体步骤如下:
实现代码
首先导入必要的函数,然后对源DataFrame做处理:
import org.apache.spark.sql.functions._ // 假设你的源DataFrame名称是df val transposedDf = df // 用常量1创建临时分组,把所有行归为一组 .groupBy(lit(1)) // 将COLUMN_NAME列的每个唯一值转成新的列 .pivot("COLUMN_NAME") // 聚合每个新列对应的VALUE值,这里用first因为每个列只有一个值 .agg(first("VALUE")) // 删除临时创建的分组列 .drop("1") // 查看结果 transposedDf.show()
代码解释
groupBy(lit(1)):因为我们需要把所有行合并成一行,所以用lit(1)生成一个值全为1的临时列,作为分组依据,这样所有数据都会被分到同一个组里。pivot("COLUMN_NAME"):这是转置的核心,它会把COLUMN_NAME列中的每个唯一值,转换成新的列名。agg(first("VALUE")):每个新列对应的VALUE只有一条数据,用first函数直接取到这个值即可;如果你的数据里有重复的列名,可以换成collect_list或者concat_ws来处理重复值。drop("1"):最后删掉那个临时的分组列,得到你想要的宽表结构。
运行这段代码后,就能得到你期望的转置结果啦!
内容的提问来源于stack exchange,提问作者Maruti K
相关产品推荐
相关产品推荐

