So fragen Sie Datenunterschiede zwischen zwei isomorphen Tabellen mit umfangreichen Daten ab

So fragen Sie Datenunterschiede zwischen zwei isomorphen Tabellen mit umfangreichen Daten ab

1. Hintergrund

Diese Frage war Teil meines zweiten Vorstellungsgesprächs bei Baidu. Wenn ich sie nicht beantwortete, hatte das wahrscheinlich große Auswirkungen auf meine Notenbewertung ...

2. Analyseprozess

……

Überprüfung der gleichen Tabellenstrukturdaten: z. B. Ändern der Tabellenlogik

Ähnliche Überprüfung der Tabellenstrukturdaten: z. B. Ändern von Tabellenfeldern.

Überprüfung der Daten einer neuen Tabelle: Wenn Sie beispielsweise eine neue Tabelle entwickeln, wählen Sie eine Vergleichstabelle als Referenz usw. aus.

3. Methode zur Nummernüberprüfung

Drei Schritte zur Datenüberprüfung:

  1. Vergleich der Datengrößen: Vergleichen Sie zunächst die Datengrößen der Kernfelder der beiden Tabellen. Wenn die Größen unterschiedlich sind, sind die Daten in den beiden Tabellen definitiv inkonsistent.
  2. Konsistenzvergleich: Wenn die Größen gleich sind, vergleichen Sie die Konsistenz.
  3. Erkennung von Differenzdaten: Wenn die Daten inkonsistent sind, drucken Sie die inkonsistenten Daten aus.

3.1 Vergleich der Datengrößen

select left_table.pv-right_table.pv as pv_diff,
       left_table.user_id_uv - right_table.user_id_uv as user_id_uv_diff,
       left_table.order_id_uv - right_table.order_id_uv as order_id_uv_diff,
       left_table.city_id_uv - right_table.city_id_uv as city_id_uv_diff
  from (
        select count(1) as pv,
               count(distinct user_id) as user_id_uv,
               count(distinct order_id) as order_id_uv,
               count(distinct city_id) as city_id_uv
          from mart_online.fact_user_order_day
         where dt=20190413
       )left_table
  left outer join (
        select count(1) as pv,
               count(distinct user_id) as user_id_uv,
               count(distinct order_id) as order_id_uv,
               count(distinct city_id) as city_id_uv
          from mart_test.fact_user_order_day
         where dt=20190413
       )right_table
    on 1=1

左表pv减去右表pv值为:[0],核心字段uv差为:[0] 即两个表数据条数相同
+-------+----------------+------------------+---------------+
|pv_diff|user_id_uv_diff |order_id_uv_diff  |city_id_uv_diff|
+-------+----------------+------------------+---------------+
|      0|               0|                 0|              0|
+-------+----------------+------------------+---------------+

3.2 Konsistenzvergleich

3.2.1 Gouji-Verifizierung + MD5-Methode

Gouji ist der Name eines kleinen Mädchens. Hier betrachten wir die left_table_num, die in der linken Tabelle nicht NULL ist, die right_table_num, die in der rechten Tabelle nicht NULL ist, und die left_right_equal_num, die beide Tabellen haben. Wenn diese drei Zahlen gleich sind Dies bedeutet, dass die Daten konsistent sind. . Im Gegenteil, die Daten sind definitiv inkonsistent und die Anzahl der inkonsistenten Elemente kann berechnet werden.

MD5: Berechnen Sie den MD5-Wert einer Datenzeile und verwenden Sie ihn als Schlüssel zum Vergleich. Insbesondere bei Datenmengen im zweistelligen Milliardenbereich wird diese Methode ebenfalls verwendet.

************ Konsistenzprüfung des Datenvolumens SQL *************** Hinweis: Hier wird ein vollständiger Join verwendet

select sum(case when left_table.record_key is not null or left_table.record_key !='' then 1 else 0 end) as left_table_num,
       sum(case when right_table.record_key is not null or right_table.record_key !='' then 1 else 0 end) as right_table_num,
       sum(case when left_table.record_key = right_table.record_key then 1 else 0 end) as left_right_equal_num
  from (
        select md5(
        concat(
              if(user_id is null, '-', cast(user_id as string)),
              if(user_name is null, '-', cast(user_name as string)),
              if(order_id is null, '-', cast(order_id as string)),
              if(city_id is null, '-', cast(city_id as string)),
              if(city_name is null, '-', cast(city_name as string)),
              if(字段n…… is null, '-', cast(字段n…… as string)),
              if(dt is null, '-', cast(dt as string))
              )
        ) as record_key
          from mart_online.fact_user_order_day
         where dt=20190413
       )left_table
  full outer join (
        select md5(
        concat(
              if(user_id is null, '-', cast(user_id as string)),
              if(user_name is null, '-', cast(user_name as string)),
              if(order_id is null, '-', cast(order_id as string)),
              if(city_id is null, '-', cast(city_id as string)),
              if(city_name is null, '-', cast(city_name as string)),
              if(字段n…… is null, '-', cast(字段n…… as string)),
              if(dt is null, '-', cast(dt as string))
              )
        ) as record_key
          from mart_test.fact_user_order_day
         where dt=20190413
       )right_table
    on left_table.record_key=right_table.record_key


************ 数据量一致性验证报表 *************
[left_table_num]左表中的数据条数,[right_table_num]右表中的条数,[left_right_equal_num]两个表中相等的数据条数。
左表中有[5660]条数据和右表不一致!
+--------------+---------------+--------------------+
|left_table_num|right_table_num|left_right_equal_num|
+--------------+---------------+--------------------+
|      16358699|       16358699|            16353039|
+--------------+---------------+--------------------+

3.2.2 Gewaltsame Vergleichsmethode

Geeignet für Tabellen mit eindeutigen IDs. Die Rückgabe eines leeren Werts zeigt an, dass die Überprüfung korrekt ist.

select online.*,
       test.* from(
        select id,
               user_id,
               user_name,
               order_id,
               city_id,
               city_name
          from mart_online.fact_user_order_day
         where dt='20190413'
       )online
  left outer join (
        select id,
               user_id,
               user_name,
               order_id,
               city_id,
               city_name
          from mart_test.fact_user_order_day
         where dt='20190413'
       ) test
    on test.id=online.id
 where test.user_id!=online.user_id
    or test.user_name!=online.user_name
    or test.order_id!=online.order_id
    or test.city_id!= online.city_id
    or test.city_name!= online.city_name

3.3 Erkennung von Differenzdaten

Es gibt viele Möglichkeiten, Differenzdaten zu finden. Hier ist nur eine allgemeine Methode: Element-für-Element-Vergleich (vorausgesetzt, die beiden Tabellen haben eindeutige IDs. Wenn keine eindeutige ID vorhanden ist, sind die Daten mit unterschiedlichen MD5s tatsächlich inkonsistent ).Diese Methode eignet sich für Daten in kleinem Maßstab. Wenn wir sie implementieren, kombinieren wir sie natürlich mit der Konsistenzprüfung und können die verschiedenen Daten direkt finden und ausdrucken.

select left_table.*,
       right_table.*
  from (
        select *
          from mart_online.fact_user_order_day
         where dt=20190413
       )left_table
  full outer join (
        select *
          from mart_test.fact_user_order_day
         where dt=20190413
       )right_table
    on left_table.id = right_table.id
   and left_table.dt = right_table.dt
 where COALESCE(left_table.user_id, 0) <> COALESCE(right_table.user_id, 0)
    or COALESCE(left_table.user_name, 0) <> COALESCE(right_table.user_name, 0)
    or COALESCE(left_table.order_id, 0) <> COALESCE(right_table.order_id, 0)
    or COALESCE(left_table.city_id, 0) <> COALESCE(right_table.city_id, 0)
    or COALESCE(left_table.city_name, 0) <> COALESCE(right_table.city_name, 0)
    or COALESCE(left_table.字段n……, 0) <> COALESCE(right_table.字段n……, 0)


不一致的条数:[5660],case如下表所示:
+-------+----------------+------------------+---------------+---------------+
|id     |left_user_id    |left_字段n……       |right_user_id  |right_字段n……   |
+-------+----------------+------------------+---------------+---------------+
|      0|               1|             哇哈哈|              1|           养乐多|
+-------+----------------+------------------+---------------+---------------+

4. Zusammenfassung

Das obige Verifizierungs-SQL kann durch Code gekapselt und automatisch generiert werden und kann in ein kleines Tool zur automatisierten Datenüberprüfung umgewandelt werden. Die tatsächliche Situation ist komplizierter. Wir müssen die Identifizierung von Feldern und Bedingungen berücksichtigen, ob die beiden Tabellen eindeutige IDs haben, wie mit dem Fehlen eindeutiger IDs umgegangen werden soll usw.

Guess you like

Origin blog.csdn.net/weixin_46651125/article/details/131807683