Вы можете использовать простой select
в сочетании с Scala Map
. Проще обрабатывать преобразования столбцов через словарь (карта), ключ которого будет старое имя и значение новое имя .
Позволяет сначала создать два наборы данных, как вы их описали:
val df1 = Seq(
("toto", 23, "g", "2010-06-09"),
("bla", 35, "s", "1990-10-01"),
("pino", 12, "a", "1995-10-05")
).toDF("fname", "age", "class", "dob")
val df2 = Seq(
("toto", 23, "g", "2010-06-09"),
("bla", 35, "s", "1990-10-01"),
("pino", 12, "a", "1995-10-05")
).toDF("f_name", "user_age", "class", "DataofBith")
Затем мы создали функцию Scala с именем transform
, которая принимает два аргумента, цель df
и mapping
, которая содержит детали преобразований:
val mapping = Map(
"fname" -> "first_name",
"f_name" -> "first_name",
"user_age" -> "age",
"DataofBith" -> "dob"
)
def transform(df: DataFrame, mapping: Map[String, String]) : DataFrame = {
val keys = mapping.keySet
val cols = df.columns.map{c =>
if(keys.contains(c))
df(c).as(mapping(c))
else
df(c)
}
df.select(cols:_*)
}
Функция просматривает указанные столбцы, сначала проверяя, существует ли текущий столбец в mapping
. Если это так, он переименовывает, используя соответствующее значение из словаря, в противном случае столбец остается нетронутым. Обратите внимание, что это просто переименует столбец (через псевдоним), поэтому мы не ожидаем, что это повлияет на производительность.
Наконец, несколько примеров:
val newDF1 = transform(df1, mapping)
newDF1.show
// +----------+---+-----+----------+
// |first_name|age|class| dob|
// +----------+---+-----+----------+
// | toto| 23| g|2010-06-09|
// | bla| 35| s|1990-10-01|
// | pino| 12| a|1995-10-05|
// +----------+---+-----+----------+
val newDF2 = transform(df2, mapping)
newDF2.show
// +----------+---+-----+----------+
// |first_name|age|class| dob|
// +----------+---+-----+----------+
// | toto| 23| g|2010-06-09|
// | bla| 35| s|1990-10-01|
// | pino| 12| a|1995-10-05|
// +----------+---+-----+----------+