#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. Это выглядит интересно, я пробую эту версию