Spark: Как объединить два похожих столбца из двух фреймов данных в один столбец, выполнив объединение?

#apache-spark #apache-spark-sql

Вопрос:

У меня есть таблица SQL, которую я должен обновить, используя данные из таблицы with.

Для этой цели я вычисляю фрейм данных.

У меня есть два фрейма данных: то, что я вычисляю, и то, что я получаю из базы данных.

 val myDF = spark.read.lt;todo somethinggt;.load()  val dbDF = spark.read.format("jdbc").lt;...gt;.load()  

Наконец, оба фрейма данных имеют одинаковую структуру.

Например:

myDF

Клавиша колонка
ключ1 1
ключ2 2
ключ3 3

dbDF

Клавиша колонка
ключ1 5
ключ2 5
ключ3 5

Мне нужно получить новый DF, в котором будет только один столбец с именем столбца.

Новая версия

Клавиша колонка
ключ1 6
ключ2 7
ключ3 8

Для этой цели я выполняю следующие действия:

 myDF  .as("left")  .join(dbDF.as("right"), "key")  .withColumn("column_temp", $"left.column"   $"right.column")  .drop($"left.column")  .drop(s"right.column")  .withColumnRenamed("column_temp", "column")  

Я должен выполнить эти действия для каждого столбца, который я должен рассчитать.

Другими словами, мои объединения не предполагают добавления новых столбцов. Я должен объединить похожие столбцы в один столбец.

Я могу вычислить новый столбец по сумме двух столбцов, или я могу просто выбрать не нулевой столбец из двух заданных столбцов, например:

 myDF  .as("left")  .join(dbDF.as("right"), $"key", "outer")  .withColumn("column_temp", coalesce($"left.column", $"right.column"))  .drop($"left.column")  .drop(s"right.column")  .withColumnRenamed("column_temp", "column")  

И когда в моем фрейме данных много столбцов и только 1 или 2 ключевых столбца, я должен повторить описанные выше действия для каждого столбца.

Мой вопрос таков:

Есть ли более эффективный способ делать то, что я делаю? Или я все делаю правильно?

Ответ №1:

 myDF.join(dbDF,myDF.col("key").equalTo(dbDF.col("key")))  .select(myDF.col("key"),myDF.col("column").plus(dbDF.col("column")).alias("column");  

Ты можешь попробовать это? Это внутреннее соединение, поэтому выбираются только те строки в левой таблице, которые совпадают в правой. Это ваше дело?

Комментарии:

1. Но вы вычисляете значение столбца «столбец», используя значения столбцов «ключ».

2. извините, только что обновил ответ.

3. Это выглядит интересно, я пробую эту версию