【问题标题】:How can i get output as below jn spark scala如何在 spark scala 中获得如下输出
【发布时间】:2021-12-24 21:48:46
【问题描述】:

我有如下数据。

A B C D
1 A Day D1
1 A Tim 1am
1 A Tim 3am

需要这样创作

A B Day Tim1 Tim2
1 A D1 1am 3am

你能帮助如何进入 spark scala

【问题讨论】:

  • 这是一个基本的pivot 用例:df.groupBy("A", "B").pivot("C").agg(first("D"))
  • 是的,pivot 在这里有效,但如果我同时有不同的值,我必须将它们分成两个
  • 然后先检查重复项。

标签: scala apache-spark-sql azure-synapse


【解决方案1】:

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

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 |
//+---+---+---+----+----+

【讨论】:

  • 非常感谢.. 它正在工作,但有时我可能无法获得两个值,但我想与他和 tim2 创建两列
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-18
  • 2021-02-15
  • 2021-12-19
  • 2020-03-07
  • 2016-02-11
相关资源
最近更新 更多