web-dev-qa-db-fra.com

Comment comparer deux colonnes de données et imprimer des colonnes différentes dans scala

Nous avons deux trames de données ici:

le dataframe attendu:

+------+---------+--------+----------+-------+--------+
|emp_id| emp_city|emp_name| emp_phone|emp_sal|emp_site|
+------+---------+--------+----------+-------+--------+
|     3|  Chennai|  rahman|9848022330|  45000|SanRamon|
|     1|Hyderabad|     ram|9848022338|  50000|      SF|
|     2|Hyderabad|   robin|9848022339|  40000|      LA|
|     4|  sanjose|   romin|9848022331|  45123|SanRamon|
+------+---------+--------+----------+-------+--------+

et la trame de données réelle:

+------+---------+--------+----------+-------+--------+
|emp_id| emp_city|emp_name| emp_phone|emp_sal|emp_site|
+------+---------+--------+----------+-------+--------+
|     3|  Chennai|  rahman|9848022330|  45000|SanRamon|
|     1|Hyderabad|     ram|9848022338|  50000|      SF|
|     2|Hyderabad|   robin|9848022339|  40000|      LA|
|     4|  sanjose|  romino|9848022331|  45123|SanRamon|
+------+---------+--------+----------+-------+--------+

la différence entre les deux cadres de données est maintenant:

+------+--------+--------+----------+-------+--------+
|emp_id|emp_city|emp_name| emp_phone|emp_sal|emp_site|
+------+--------+--------+----------+-------+--------+
|     4| sanjose|  romino|9848022331|  45123|SanRamon|
+------+--------+--------+----------+-------+--------+

Nous utilisons la fonction except df1.except (df2), mais le problème, c’est qu’elle renvoie les lignes entières qui sont différentes. Ce que nous voulons, c'est voir quelles colonnes sont différentes dans cette ligne (dans ce cas, "romin" et "romino" de "emp_name" sont différents). Nous avons énormément de difficulté avec cela et toute aide serait formidable.

16
rominoushana

D'après le scénario décrit dans la question ci-dessus, il semble que la différence doit être trouvée entre des colonnes et non des lignes.

Pour ce faire, nous devons appliquer ici la différence sélective, qui nous fournira les colonnes qui ont des valeurs différentes, ainsi que les valeurs.

Maintenant, pour appliquer la différence sélective, nous devons écrire du code comme ceci:

  1. Nous devons d’abord trouver les colonnes dans les cadres de données attendus et réels.

    val columns = df1.schema.fields.map (_. name)

  2. Ensuite, nous devons trouver la différence par colonne.

    val sélectDifferences = columns.map (col => df1.select (col) .except (df2.select (col)))

  3. Enfin, nous devons déterminer quelles colonnes contiennent des valeurs différentes.

    selectDifferences.map (diff => {if (diff.count> 0) diff.show})

Et nous n'obtiendrons que les colonnes contenant des valeurs différentes. Comme ça:

+--------+
|emp_name|
+--------+
|  romino|
+--------+

J'espère que ça aide!

33
himanshuIIITian