我有一個如下的資料框:
----------- ----------- --------------- ------ ---------------------
|best_col |A |B | C |<many more columns> |
----------- ----------- --------------- ------ ---------------------
| A | 14 | 26 | 32 | ... |
| C | 13 | 17 | 96 | ... |
| B | 23 | 19 | 42 | ... |
----------- ----------- --------------- ------ ---------------------
我想以這樣的 DataFrame 結尾:
----------- ----------- --------------- ------ --------------------- ----------
|best_col |A |B | C |<many more columns> | result |
----------- ----------- --------------- ------ --------------------- ----------
| A | 14 | 26 | 32 | ... | 14 |
| C | 13 | 17 | 96 | ... | 96 |
| B | 23 | 19 | 42 | ... | 19 |
----------- ----------- --------------- ------ --------------------- ----------
本質上,我想添加一個列result,該列將從列中指定的best_col列中選擇值。best_col僅包含 DataFrame 中存在的列名。由于我有幾十列,我想避免使用一堆 when 陳述句來檢查何時col(best_col) === A等。我試過做col(col("best_col").toString()),但這沒有用。是否有捷徑可尋?
uj5u.com熱心網友回復:
map_filterSpark 3.0 中引入的使用:
val df = Seq(
("A", 14, 26, 32),
("C", 13, 17, 96),
("B", 23, 19, 42),
).toDF("best_col", "A", "B", "C")
df.withColumn("result", map(df.columns.tail.flatMap(c => Seq(col(c), lit(col("best_col") === lit(c)))): _*))
.withColumn("result", map_filter(col("result"), (a, b) => b))
.withColumn("result", map_keys(col("result"))(0))
.show()
-------- --- --- --- ------
|best_col| A| B| C|result|
-------- --- --- --- ------
| A| 14| 26| 32| 14|
| C| 13| 17| 96| 96|
| B| 23| 19| 42| 19|
-------- --- --- --- ------
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/496945.html
上一篇:Scala:單例物件與匿名類
