Программно Переименовать Все, Кроме Одного Столбца Spark Scala
У меня есть такой фрейм данных:
val df = Seq(
("LeBron", 36, 18, 12),
("Kevin", 42, 8, 9),
("Russell", 44, 5, 14)).
toDF("player", "points", "rebounds", "assists")
df.show()
+-------+------+--------+-------+
| player|points|rebounds|assists|
+-------+------+--------+-------+
| LeBron| 36| 18| 12|
| Kevin| 42| 8| 9|
|Russell| 44| 5| 14|
+-------+------+--------+-------+
Я хочу добавить "season_high" к каждому имени столбца, кроме player
. Я также хочу использовать функцию, чтобы сделать это, потому что мой реальный набор данных имеет 250 столбцов.
Я придумал метод ниже, который дает мне вывод, который я хочу, но мне интересно, есть ли способ передать правило в функцию отображения renamedColumns
, которая делает это так, чтобы имя столбца player
не переключалось на season_high_player
, а затем обратно в player
с дополнительным .withColumnRenamed
.]} функция.
val renamedColumns = df.columns.map(name => col(name).as(s"season_high_$name"))
val df2 = df.select(renamedColumns : _*).
withColumnRenamed("season_high_player", "player")
df2.show()
+-------+------------------+--------------------+-------------------+
| player|season_high_points|season_high_rebounds|season_high_assists|
+-------+------------------+--------------------+-------------------+
| LeBron| 36| 18| 12|
| Kevin| 42| 8| 9|
|Russell| 44| 5| 14|
+-------+------------------+--------------------+-------------------+
2 ответа:
@philantrovert был прав, но он просто забыл сказать вам, как использовать эту "формулу", так что вот вам:
val selection = Seq(col("player")) ++ df.columns.filter(_ != "player").map(name => col(name).as(s"season_high_$name")) df.select(selection : _*).show // +-------+------------------+--------------------+-------------------+ // | player|season_high_points|season_high_rebounds|season_high_assists| // +-------+------------------+--------------------+-------------------+ // | LeBron| 36| 18| 12| // | Kevin| 42| 8| 9| // |Russell| 44| 5| 14| // +-------+------------------+--------------------+-------------------+
Вы можете сделать следующее, сделав один столбец, который вы не хотите переименовывать, первым столбцом и применив следующую логику
import org.apache.spark.sql.functions._ val columnsRenamed = col(df.columns.head) +: df.columns.tail.map(name => col(name).as(s"season_high_$name")) df.select(columnsRenamed :_*).show(false)
Вы должны получать выходные данные в виде
+-------+------------------+--------------------+-------------------+ |player |season_high_points|season_high_rebounds|season_high_assists| +-------+------------------+--------------------+-------------------+ |LeBron |36 |18 |12 | |Kevin |42 |8 |9 | |Russell|44 |5 |14 | +-------+------------------+--------------------+-------------------+