首页 > 解决方案 > 我怎样才能得到如下的输出 jn spark scala

问题描述

我有如下数据。

一个 C D
1 一个 D1
1 一个 蒂姆 凌晨 1 点
1 一个 蒂姆 凌晨3点

需要这样创建

一个 提姆1 时间2
1 一个 D1 凌晨 1 点 凌晨3点

你能帮助如何进入火花斯卡拉

标签: scalaapache-spark-sqlazure-synapse

解决方案


您可以先添加重复项的行号,然后再进行透视。

import org.apache.spark.sql.expressions.Window

val w1 = Window.partitionBy("A", "B", "C").orderBy("D")
val w2 = Window.partitionBy("A", "B", "C")

val df1 = df0.withColumn("row_num", row_number().over(w1)).withColumn("max_num", max("row_num").over(w2))
df1.show(false)

//+---+---+---+---+-------+-------+
//|A  |B  |C  |D  |row_num|max_num|
//+---+---+---+---+-------+-------+
//|1  |A  |Tim|1am|1      |2      |
//|1  |A  |Tim|3am|2      |2      |
//|1  |A  |Day|D1 |1      |1      |
//+---+---+---+---+-------+-------+


val df2 = df1.withColumn("C", expr("if(max_num != 1, concat(C, row_num), C)"))
df2.show(false)

//+---+---+----+---+-------+-------+
//|A  |B  |C   |D  |row_num|max_num|
//+---+---+----+---+-------+-------+
//|1  |A  |Tim1|1am|1      |2      |
//|1  |A  |Tim2|3am|2      |2      |
//|1  |A  |Day |D1 |1      |1      |
//+---+---+----+---+-------+-------+


val df3 = df2.groupBy("A", "B").pivot("C").agg(first("D"))
df3.show(false)

//+---+---+---+----+----+
//|A  |B  |Day|Tim1|Tim2|
//+---+---+---+----+----+
//|1  |A  |D1 |1am |3am |
//+---+---+---+----+----+

推荐阅读