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.
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.
pourquoi pas le dessous?
df1.except(df2)
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