我有一個包含以下內容的 Spark 資料框:
| 名稱 | E1 | E2 | E3 |
|---|---|---|---|
| 美國廣播公司 | 4 | 5 | 6 |
我需要各個E列成為新列中的行,如下所示:
| 名稱 | 價值 | E型 |
|---|---|---|
| 美國廣播公司 | 4 | E1 |
| 美國廣播公司 | 5 | E2 |
| 美國廣播公司 | 6 | E3 |
這個答案
給了我使用的想法,explode我現在有以下代碼:
df.select($"Name", explode(array("E1", "E2", "E3")).as("value"))
上面的代碼為我提供了我需要的 Name 和 value 列,但我仍然需要一種方法來根據傳遞給的陣列中的哪個值explode用于填充該特定行來添加 EType 列。
上面代碼的輸出:
| 名稱 | 價值 |
|---|---|
| 美國廣播公司 | 4 |
| 美國廣播公司 | 5 |
| 美國廣播公司 | 6 |
如何添加 Etype 列?
(我在 Scala 中使用 Spark 2.2)
謝謝!
uj5u.com熱心網友回復:
您可以stack在這種特殊情況下使用函式。
df.selectExpr('Name', "stack(3, E1, 'E1', E2, 'E2', E3, 'E3')").toDF('Name', 'value', 'EType').show()
df.selectExpr('Name', "stack(3, E1, 'E1', E2, 'E2', E3, 'E3')").toDF('Name', 'value', 'EType').show()
df.selectExpr('Name', "stack(3, E1, 'E1', E2, 'E2', E3, 'E3')").toDF('Name', 'value', 'EType').show()
---- ----- -----
|Name|value|EType|
---- ----- -----
| abc| 4| E1|
| abc| 5| E2|
| abc| 6| E3|
---- ----- -----
uj5u.com熱心網友回復:
您可以分解struct包含列名稱及其內容的a ,而不是僅分解 value,如下所示:
import org.apache.spark.sql.functions.{array, col, explode, lit, struct}
val result = df
.select(
col("name"),
explode(array(
df.columns.filterNot(_ == "name").map(c => struct(lit(c).as("EType"), col(c).alias("value"))): _*
))
)
.select("name", "col.*")
通過您的輸入,您將獲得result資料框:
---- ----- -----
|name|EType|value|
---- ----- -----
|abc |E1 |4 |
|abc |E2 |5 |
|abc |E3 |6 |
---- ----- -----
uj5u.com熱心網友回復:
此處需要使用熔體操作。
注意:pyspark 中不存在 Melt 功能,您需要撰寫該 util 函式。
你可以去想這個關于如何實作融化功能的答案如何融化 Spark DataFrame?
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/381437.html
標籤:斯卡拉 阿帕奇火花 apache-spark-sql apache-spark-数据集
