scala - 我怎样才能得到如下的输出 jn spark scala
问题描述
我有如下数据。
一个 | 乙 | C | D |
---|---|---|---|
1 | 一个 | 天 | D1 |
1 | 一个 | 蒂姆 | 凌晨 1 点 |
1 | 一个 | 蒂姆 | 凌晨3点 |
需要这样创建
一个 | 乙 | 天 | 提姆1 | 时间2 |
---|---|---|---|---|
1 | 一个 | D1 | 凌晨 1 点 | 凌晨3点 |
你能帮助如何进入火花斯卡拉
解决方案
您可以先添加重复项的行号,然后再进行透视。
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 |
//+---+---+---+----+----+
推荐阅读
- c# - 标签文本溢出时如何更改表单大小?
- django - 如何使用外键设置 Django 模型继承
- java - 如何获取旧的 MS-office 文件的最后修改日期,例如 .xls 和 .doc 文件
- vue.js - error 解析错误:意外的令牌(Nuxt.js)
- ajax - How to refresh table data with Ajax
- validation - 如何根据范围为输入数字制定规则?
- python - 为什么在openCV灰度处理之后,通道消失了?
- php - 如何使用 PHP 从用户定义的值增加 mysql 数据库列中的值?
- bitrock - 如何本地化内置 BitRock 变量
- python - 当 sizer 项目隐藏时,GridBagSizer 可以拉伸吗?