DataFrame de l'égalité dans Apache Spark
Assumer df1
et df2
sont deux DataFrame
s dans Apache Spark, calculée à l'aide de deux mécanismes différents, par exemple, la Spark SQL vs la Scala/Java/Python API.
Est-il un idiomatiques façon de déterminer si les deux trames de données sont équivalentes (égalité, isomorphe), où l'équivalence est déterminée par les données (noms de colonnes et les valeurs de colonne pour chaque ligne) étant identiques sauf pour la commande de lignes & colonnes?
La motivation de la question est qu'il y a souvent de nombreuses façons de calculer certaines données big data suite, chacune avec son propre compromis. Comme on explore ces échanges, il est important de maintenir l'exactitude et donc la nécessité de vérifier l'équivalence pour l'égalité sur un test significatif de l'ensemble de données.
OriginalL'auteur Sim | 2015-07-03
Vous devez vous connecter pour publier un commentaire.
Il y a certaines façons de Apache Spark suites de test, mais la plupart de ces consistent à collecter les données en local et si vous voulez faire de l'égalité des tests sur de grandes DataFrames alors ce n'est probablement pas une solution adaptée.
Vérifier le schéma d'abord, et puis vous pouvez faire une intersection à df3 et vérifier que le comte de df1,df2 & df3 sont tous égaux (cependant cela ne fonctionne que si il n'y a pas de doublons, si différents des doublons de lignes cette méthode pourrait toujours retourner true).
Une autre option serait d'obtenir le sous-jacent Rdd à la fois de la DataFrames, de la cartographie (Ligne, 1), faire un reduceByKey pour compter le nombre de chaque Ligne, puis cogrouping les deux résultant de la Rdd et puis faire régulièrement de l'agrégat et de retourner false si l'un des itérateurs ne sont pas égaux.
OriginalL'auteur Holden
Je ne sais pas idiomatiques, mais je pense que vous pouvez obtenir un bon moyen pour comparer DataFrames comme vous le décrivez comme suit. (Je suis en utilisant PySpark pour l'illustration, mais l'approche transporte à travers les langues.)
Cette approche gère correctement les cas où la DataFrames peuvent avoir de doublons de lignes, les lignes de commandes, et/ou des colonnes dans des ordres différents.
Par exemple:
Cette approche est assez cher, mais la plupart de la dépense est inévitable compte tenu de la nécessité d'effectuer un diff complet. Et cela devrait échelle fine, comme il ne nécessite pas la collecte de rien localement. Si vous relaxer la contrainte que la comparaison doit tenir compte des lignes en double, vous pouvez ensuite déposer la
groupBy()
et il suffit de faire lasubtract()
, ce qui devrait accélérer les choses notamment.OriginalL'auteur Nick Chammas
La spark-rapide-tests bibliothèque a deux méthodes pour faire de l'DataFrame comparaisons (je suis le créateur de la bibliothèque):
La
assertSmallDataFrameEquality
méthode de collecte DataFrames sur le pilote nœud et rend la comparaisonLa
assertLargeDataFrameEquality
méthode compare DataFrames réparties sur plusieurs machines (le code est essentiellement copié à partir de l'étincelle-essai-de base)assertSmallDataFrameEquality
est plus rapide pour les petites DataFrame comparaisons et j'ai trouvé que c'est suffisant pour mon test suites.OriginalL'auteur Powers
Java:
OriginalL'auteur user1442346
Vous pouvez faire cela en utilisant un peu de déduplication en combinaison avec une jointure externe complète. L'avantage de cette approche est qu'il ne vous oblige pas à recueillir les résultats pour le pilote, et qu'il évite l'exécution de plusieurs emplois.
OriginalL'auteur Herman van Hovell