我有如下資料。
| 一種 | 乙 | C | D |
|---|---|---|---|
| 1 | 一種 | 日 | D1 |
| 1 | 一種 | 蒂姆 | 凌晨 1 點 |
| 1 | 一種 | 蒂姆 | 凌晨3點 |
需要像這樣創建
| 一種 | 乙 | 日 | 時間 1 | 蒂姆2 |
|---|---|---|---|---|
| 1 | 一種 | D1 | 凌晨 1 點 | 凌晨3點 |
你能幫助如何進入火花斯卡拉嗎
uj5u.com熱心網友回復:
您可以先添加重復項的行號,然后再進行資料透視。
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 |
// --- --- --- ---- ----
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/358563.html
