Как изменить строки данных на основе другого кадра данных в Spark? - PullRequest
1 голос
/ 29 июня 2019

У меня есть датафрейм, df2, такой как:

ID | data
--------
1 | New
3 | New 
5 | New

и основной кадр данных, df1:

ID | data | more
----------------
1 | OLD | a
2 | OLD | b
3 | OLD | c
4 | OLD | d
5 | OLD | e

Я хочу достичь чего-то подобного:

ID | data | more
----------------
1 | NEW | a
2 | OLD | b
3 | NEW | c
4 | OLD | d
5 | NEW | e

Я хочу обновить df1 на основе df2, сохранив исходные значения df1, когда они не существуют в df2.

Есть ли более быстрый способ сделать это, чем использование isin? Isin очень медленный, когда df1 и df2 оба очень велики.

1 Ответ

2 голосов
/ 29 июня 2019

С левым соединением и "объединением":

val df1 = Seq(
  (1, "OLD", "a"),
  (2, "OLD", "b"),
  (3, "OLD", "c"),
  (4, "OLD", "d"),
  (5, "OLD", "e")).toDF("ID", "data", "more")

val df2 = Seq(
  (1, "New"),
  (3, "New"),
  (5, "New")).toDF("ID", "data")

// action
val result = df1.alias("df1")
  .join(
    df2.alias("df2"),$"df2.ID" === $"df1.ID", "left")
  .select($"df1.ID",
    coalesce($"df2.data", $"df1.data").alias("data"),
    $"more")

Вывод:

+---+----+----+
|ID |data|more|
+---+----+----+
|1  |New |a   |
|2  |OLD |b   |
|3  |New |c   |
|4  |OLD |d   |
|5  |New |e   |
+---+----+----+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...