web-dev-qa-db-fra.com

Comparaison de deux tables pour l'égalité dans HIVE

J'ai deux tables, table1 et table2. Chacune avec les mêmes colonnes:

key, c1, c2, c3

Je veux vérifier si ces tables sont égales entre elles (elles ont les mêmes lignes). Jusqu'ici j'ai ces deux requêtes (<> = pas égales dans Hive):

select count(*) from table1 t1 
left outer join table2 t2
on t1.key=t2.key
where t2.key is null or t1.c1<>t2.c1 or t1.c2<>t2.c2 or t1.c3<>t2.c3

Et

select count(*) from table1 t1
left outer join table2 t2
on t1.key=t2.key and t1.c1=t2.c1 and t1.c2=t2.c2 and t1.c3=t2.c3
where t2.key is null

Donc, mon idée est que, si un nombre égal à zéro est renvoyé, les tables sont les mêmes. Cependant, j'obtiens un compte zéro pour la première requête et un compte autre que zéro pour la seconde requête. En quoi diffèrent-ils exactement? S'il y a un meilleur moyen de vérifier cela, faites-le moi savoir.

7
Danzo

La première exclut les lignes où t1.c1, t1.c2, t1.c3, t2.c1, t2.c2 ou t2.c3 sont nuls. Cela signifie que vous effectuez effectivement une jointure interne.

Le second trouvera les lignes qui existent dans t1 mais pas dans t2.

Pour rechercher également les lignes qui existent dans t2 mais pas dans t1, vous pouvez effectuer une jointure externe complète. Le code SQL suivant suppose que toutes les colonnes sont NOT NULL:

select count(*) from table1 t1
full outer join table2 t2
on t1.key=t2.key and t1.c1=t2.c1 and t1.c2=t2.c2 and t1.c3=t2.c3
where t1.key is null /* this condition matches rows that only exist in t2 */
   or t2.key is null /* this condition matches rows that only exist in t1 */
11
Klas Lindbäck

Si vous voulez vérifier les doublons et les tables ont exactement la même structure et les tables ne contiennent pas de doublons, vous pouvez alors:

select t.key, t.c1, t.c2, t.c3, count(*) as cnt
from ((select t1.*, 1 as which from table1 t1) union all
      (select t2.*, 2 as which from table2 t2)
     ) t
group by t.key, t.c1, t.c2, t.c3
having cnt <> 2;

Si nécessaire, vous pouvez assouplir les conditions du premier paragraphe de différentes manières.

Notez que cette version fonctionne également lorsque les colonnes ont des valeurs NULL. Celles-ci pourraient être à l'origine du problème avec vos données.

4
Gordon Linoff

Essayez avec WITH Clause:

With cnt as(
   select count(*) cn1 from table1
   )
   select 'X' from dual,cnt where cnt.cn1 = (select count(*) from table2); 
0
Shaili

Une solution simple consiste à faire une jointure interne. Supposons que nous ayons deux tables Hive, à savoir table1 et table2. La table contient la même colonne, à savoir col1, col2 et col3. Le nombre de lignes devrait également être identique. Alors la commande serait la suivante

**

select count(*) from table1 
inner join table2 
on  table1.col1 = table2.col1 
and table1.col2 = table2.col2
and table1.col3 = table2.col3 ;

**

Si la valeur de sortie est identique au nombre de lignes de table1 et de table2, toutes les colonnes ont la même valeur. Toutefois, le nombre de sorties est inférieur à certaines données qui sont différentes.

0
Sandeep Kumar

une autre variante

select c1-c2 "different row counts"
, c1-c3 "mismatched rows" 
from 
( select count(*) c1 from table1)
,( select count(*) c2 from table2 )
,(select count(*) c3 from table1 t1, table2 t2
    where t1.key= t2.key
    and T1.c1=T2.c1 )
0
Randy

Je vous recommande de ne pas utiliser de jointure pour comparer des tables:

  • c'est une opération assez coûteuse quand les tables sont grandes (ce qui est souvent le cas dans Hive)
  • cela peut donner des problèmes lorsque certaines lignes/"joindre des clés" sont répétées

(et cela peut aussi être peu pratique lorsque les données se trouvent dans différents clusters/datacenters/clouds).

Au lieu de cela, je pense qu’il est préférable d’utiliser une approche de somme de contrôle et de comparer les sommes de contrôle des deux tableaux.

J'ai développé un script Python qui vous permet de faire facilement une telle comparaison et de voir les différences dans un navigateur Web:

https://github.com/bolcom/Hive_compared_bq

J'espère que cela peut vous aider!

0
Sourygna