it-swarm.com.de

Vergleich zweier Tabellen zur Gleichheit in HIVE

Ich habe zwei Tabellen, Table1 und Table2. Jede mit den gleichen Spalten:

key, c1, c2, c3

Ich möchte prüfen, ob diese Tabellen gleich sind (sie haben die gleichen Zeilen). Bisher habe ich diese beiden Abfragen (<> = nicht gleich in 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

Und

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

Meine Idee ist also, dass, wenn eine Nullzählung zurückgegeben wird, die Tabellen gleich sind. Ich erhalte jedoch eine Nullzählung für die erste Abfrage und eine Zählung ungleich Null für die zweite Abfrage. Wie genau unterscheiden sie sich? Wenn es einen besseren Weg gibt, dies zu überprüfen, lass es mich wissen.

7
Danzo

Die erste schließt Zeilen aus, in denen t1.c1, t1.c2, t1.c3, t2.c1, t2.c2 oder t2.c3 Null ist. Das bedeutet, dass Sie effektiv eine innere Verbindung ausführen.

Die zweite Zeile findet Zeilen, die in t1 vorhanden sind, aber nicht in t2.

Um auch Zeilen zu finden, die in t2 vorhanden sind, aber nicht in t1, können Sie eine vollständige äußere Verknüpfung ausführen. Die folgende SQL setzt voraus, dass alle Spalten NOT NULL sind:

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

Wenn Sie auf Duplikate und prüfen möchten, haben die Tabellen genau die gleiche Struktur und . Die Tabellen enthalten keine Duplikate. Dann können Sie Folgendes tun:

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;

Es gibt verschiedene Möglichkeiten, die Bedingungen im ersten Absatz bei Bedarf zu entspannen.

Beachten Sie, dass diese Version auch funktioniert, wenn die Spalten NULL-Werte haben. Diese können das Problem mit Ihren Daten verursachen.

4
Gordon Linoff

Versuchen Sie es mit WITH-Klausel:

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

Eine einfache Lösung ist die innere Verbindung. Nehmen wir an, wir haben zwei Hive-Tabellen, nämlich table1 und table2. Beide Tabellen haben die gleiche Spalte, nämlich col1, col2 und col3. Die Anzahl der Zeilen sollte auch gleich sein. Dann wäre der Befehl wie folgt

**

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

**

Wenn der Ausgabewert der Anzahl der Zeilen in Tabelle1 und Tabelle2 entspricht, haben alle Spalten den gleichen Wert. Wenn jedoch der Ausgabezähler niedriger ist als einige Daten, die sich unterscheiden.

0
Sandeep Kumar

Holen Sie sich zuerst die Zählung für beide Tabellen C1 und C2. C1 und C2 sollten gleich sein. C1 und C2 können aus der folgenden Abfrage abgerufen werden

select count(*) from table1

wenn C1 und C2 nicht gleich sind, sind die Tabellen nicht identisch.

2: Finden Sie eine eindeutige Anzahl für die Tabellen DC1 und DC2. DC1 und DC2 sollten gleich sein. Die Anzahl der unterschiedlichen Datensätze kann mit der folgenden Abfrage ermittelt werden:

select count(*) from (select distinct * from table1)

wenn DC1 und DC2 nicht gleich sind, sind die Tabellen nicht identisch.

3: Ermitteln Sie nun die Anzahl der Datensätze, die Sie durch Ausführen einer Vereinigung für die beiden Tabellen erhalten haben. Sei es U. Verwenden Sie die folgende Abfrage, um die Anzahl der Datensätze in einer Vereinigung von 2 Tabellen abzurufen:

SELECT count (*)
 FROM 
    (SELECT *
    FROM table1
    UNION
    SELECT *
    FROM table2)

Sie können sagen, dass die Daten in den 2 Tabellen identisch sind, wenn die Anzahl der eindeutigen Werte für die 2 Tabellen der Anzahl der Datensätze entspricht, die durch die Vereinigung der 2 Tabellen erhalten wurden. dh DC1 = U und DC2 = U

0
pkhabya

eine andere 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

Ich würde empfehlen, dass Sie keine JOINs verwenden, um zu versuchen, Tabellen zu vergleichen:

  • es ist ziemlich teuer, wenn Tische groß sind (was bei Hive häufig der Fall ist)
  • es kann Probleme geben, wenn einige Zeilen/"Verbindungsschlüssel" wiederholt werden

(Und es kann auch unpraktisch sein, wenn sich Daten in unterschiedlichen Clustern/Rechenzentren/Clouds befinden).

Stattdessen finde ich es am besten, einen Prüfsummenansatz zu verwenden und die Prüfsummen beider Tabellen zu vergleichen.

Ich habe ein Python-Skript entwickelt, mit dem Sie solche Vergleiche problemlos durchführen und die Unterschiede in einem Webbrowser erkennen können:

https://github.com/bolcom/Hive_compared_bq

Ich hoffe das kann dir helfen!

0
Sourygna