我有一個包含數字范圍(列開始和列結束)的 Spark 資料框,以及一個包含此范圍型別的列。我想創建一個包含兩列的新資料框,第一列列出所有范圍(增加一),第二列列出范圍的型別。為了解釋更多,這是輸入 Dataframe :
------- ------ ---------
| start | end | type |
------- ------ ---------
| 10 | 20 | LOW |
| 21 | 30 | MEDIUM |
| 31 | 40 | HIGH |
------- ------ ---------
這是預期的結果:
------- ---------
| nbr | type |
------- ---------
| 10 | LOW |
| 11 | LOW |
| 12 | LOW |
| 13 | LOW |
| 14 | LOW |
| 15 | LOW |
| 16 | LOW |
| 17 | LOW |
| 18 | LOW |
| 19 | LOW |
| 20 | LOW |
| 21 | MEDIUM |
| 22 | MEDIUM |
| .. | ... |
------- ---------
有任何想法嗎 ?
uj5u.com熱心網友回復:
嘗試這個。
val data = List((10, 20, "Low"), (21, 30, "MEDIUM"), (31, 40, "High"))
import spark.implicits._
val df = data.toDF("start", "end", "type")
df.withColumn("nbr", explode(sequence($"start", $"end"))).drop("start","end").show(false)
輸出:
------ ---
|type |nbr|
------ ---
|Low |10 |
|Low |11 |
|Low |12 |
|Low |13 |
|Low |14 |
|Low |15 |
|Low |16 |
|Low |17 |
|Low |18 |
|Low |19 |
|Low |20 |
|MEDIUM|21 |
|MEDIUM|22 |
|MEDIUM|23 |
|MEDIUM|24 |
|MEDIUM|25 |
|MEDIUM|26 |
|MEDIUM|27 |
|MEDIUM|28 |
|MEDIUM|29 |
------ ---
only showing top 20 rows
uj5u.com熱心網友回復:
如果您使用的是 Spark 2.4 ,@Learn-Hadoop 提供的解決方案有效。
對于較舊的 Spark 版本,請考慮創建一個簡單的UDF來模擬序列函式:
val sequence = udf{ (lower: Int, upper: Int) =>
Seq.iterate(lower, upper - lower 1)(_ 1)
}
df.withColumn("nbr",explode(sequence($"start",$"end"))).drop("start","end").show(false)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/372259.html
上一篇:串列中數字的頻率-Pyspark
