Программно Переименовать Все, Кроме Одного Столбца 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 2

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                 |
+-------+------------------+--------------------+-------------------+