web-dev-qa-db-fra.com

Comment obtenir la différence entre deux DataFrames?

Dans l'API SparkSQL 1.6 (scala), Dataframe a des fonctions d'intersection et d'exception, mais pas une pour la différence. Évidemment, une combinaison d'union et d'exception peut être utilisée pour générer de la différence: 

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

Mais cela semble un peu gênant. D'après mon expérience, si quelque chose vous semble gênant, il existe une meilleure façon de le faire, en particulier à Scala. 

17
WillD

Vous pouvez toujours le réécrire comme:

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

Sérieusement, ces variables UNION, INTERSECT et EXCEPT/MINUS constituent en gros un ensemble standard d'opérateurs de combinaison SQL. Je ne connais aucun système fournissant un fonctionnement tel que XOR à l’usine. Probablement parce qu'il est facile d'implémenter l'utilisation de trois autres et qu'il n'y a pas grand chose à optimiser là-bas.

24
zero323

pourquoi pas le dessous?

df1.except(df2)
4
Tal Barda

Notez que le résultat EXCEPT (ou MOINS, qui n'est qu'un alias pour EXCEPT), est doublé. Donc, si vous vous attendez à ce que "except" définisse (le diff que vous avez mentionné) + "intersecter" un ensemble égal à la structure de données d'origine, considérez cette demande de fonctionnalité qui conserve les doublons:

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

Comme je l’ai écrit ici, "EXCEPT ALL" peut être réécrit dans Spark SQL en tant que

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