创建dataframe
val df = spark.createDataFrame(Seq(
("2018-01", "项目1", 100),
("2018-01", "项目2", 200),
("2018-01", "项目3", 300),
("2018-02", "项目1", 1000),
("2018-02", "项目2", 2000),
("2018-03", "项目x", 999))).toDF("年月", "项目", "收入")
df.show()
+-------+-----+----+
| 年月| 项目|收入|
+-------+-----+----+
|2018-01|项目1| 100|
|2018-01|项目2| 200|
|2018-01|项目3| 300|
|2018-02|项目1|1000|
|2018-02|项目2|2000|
|2018-03|项目x| 999|
+-------+-----+----+
pivot作用为:行列转换
df.groupBy("年月")
.pivot("项目", Seq("项目1","项目2","项目3","项目x","unknow"))
.agg(sum("收入"))
.orderBy(asc("年月"))
.show(false)
意思是:
groupBy("年月") ->对“年月”列,进行分组
pivot("项目", Seq("项目1","项目2","项目3","项目x","unknow")) -> 选中原dataframe中的“项目”列,将此表头转换为Seq中"项目1","项目2","项目3","项目x","unknow"表头
agg(sum("收入")) -> 聚合和汇总“收入”列的数据,将其填到 对应新表头的行内容中
orderBy(asc("年月")) -> 按照“年月”进行升序排序
年月 | 项目1 | 项目2 | 项目3 | 项目x | unknow |
2018-01 | 100 | 200 | 300 | null | null |
2018-02 | 1000 | 2000 | null | null | null |
2018-03 | null | null | null | 999 | null |
上述代码等价于
df.groupBy("年月")
.pivot("项目", Seq("项目1","项目2","项目3","项目x","unknow"))
.sum("收入")
.orderBy(asc("年月"))
.show(false)