it-swarm.com.ru

Как получить разницу между двумя DataFrames?

В API SparkSQL 1.6 (scala) Dataframe имеет функции для пересечения и исключения, но не для различий. Очевидно, что комбинация union и кроме может использоваться для генерации различий: 

df1.except(df2).union(df2.except(df1))

Но это кажется немного неловким. По моему опыту, если что-то кажется неуклюжим, есть лучший способ сделать это, особенно в Scala. 

17
WillD

Вы всегда можете переписать его как:

df1.unionAll(df2).except(df1.intersect(df2))

Если серьезно, то эти UNION, INTERSECT и EXCEPT/MINUS в значительной степени являются стандартным набором операторов объединения SQL. Я не знаю ни одной системы, которая бы обеспечивала XOR аналогичные операции из коробки. Скорее всего, потому что это тривиально реализовать с использованием других трех, и там не так много, чтобы оптимизировать.

24
zero323

почему не ниже?

df1.except(df2)
4
Tal Barda

Обратите внимание, что EXCEPT (или MINUS, который является просто псевдонимом EXCEPT) приводит к снижению производительности. Так что, если вы ожидаете, что набор «кроме» (указанный вами diff) + набор «пересечение» будет равен исходному фрейму данных, рассмотрите этот запрос функции, который содержит дубликаты:

https://issues.Apache.org/jira/browse/SPARK-21274

Как я уже писал, «кроме ВСЕХ» можно переписать в Spark SQL как

SELECT a,b,c
FROM    tab1 t1
     LEFT OUTER JOIN 
        tab2 t2
     ON (
        (t1.a, t1.b, t1.c) = (t2.a, t2.b, t2.c)
     )
WHERE
    COALESCE(t2.a, t2.b, t2.c) IS NULL
1
Tagar