как обновить существующее значение второго фрейма данных, если строка существует в первом фрейме данных - PullRequest
1 голос
/ 03 августа 2020

У меня есть два фрейма данных, я хочу проверить, содержит ли df1 какую-либо строку в df2, где ключом является a и b, если равно, то изменение существует на true в df2 и добавить новые строки из df1 с существующим False

df1

a | b | c | d
1 | 1 | 3 | 4
2 | 2 | 4 | 1
3 | 3 | 5 | 3

df2

a | b | c | d
1 | 1 | 4 | 5
4 | 4 | 3 | 2

это должно выглядеть как

df3

a | b | c | d | exists
1 | 1 | 4 | 5 | True
4 | 4 | 3 | 2 | False
1 | 1 | 3 | 4 | False
2 | 2 | 4 | 1 | False
3 | 3 | 5 | 3 | False

пока что у меня есть это

val newdf = df1.join(df2, df1("a")===df2("a") && df1("b") === df2("b"), "left")
   .select(df2("a"), df2("b"),df2("c"),df2("d"),when(df2("a").isNull, false).otherwise(true).alias("exists"))

, который возвращает

a | b | c | d | exists
1 | 1 | 4 | 5 | True
rest of the rows are null 

1 Ответ

1 голос
/ 03 августа 2020

Попробуйте с left_semi, left_anti присоединяется, затем unionAll наборы данных.

Example:

df2.join(df1,Seq("a","b"),"left_semi").withColumn("exists",lit("True")).
unionAll(df2.join(df1,Seq("a","b"),"left_anti").withColumn("exists",lit("False"))).
unionAll(df1.withColumn("exists",lit("False"))).show()
//+---+---+---+---+------+
//|  a|  b|  c|  d|exists|
//+---+---+---+---+------+
//|  1|  1|  4|  5|  True|
//|  4|  4|  3|  2| False|
//|  1|  1|  3|  4| False|
//|  2|  2|  4|  1| False|
//|  3|  3|  5|  3| False|
//+---+---+---+---+------+
...