查詢兩張表 數據Diff

最近遇到了刷數據的場景,每天產出的原始數據大概有4億條,4億條數據刷到在線服務中,平均qps也有5k左右了,意義不是很大,考慮到數據也不是每天都在變,于是產生了查diff的需求。

MINUS

在搜索引擎上一搜,很容易就看到了可以用MINUS實現

SELECT * FROM T1
MINUS
SELECT * FROM T2

可惜無論 MySQL 還是 Hive 都不支持。

Left Join

Left Join 保證了左表的數據一定會存在,對于這類查Diff的場景很合適
下面這個語句可以查出來 T2中比T1新增的列
key代表表示唯一信息的那一列,例如用戶ID之類

SELECT * FOROM T1
  LEFT JOIN 
SELECT * FROM T2
  ON T1.key = T2.key
WHERE 
  T2.key is NULL

如果還想關注 某一列的指標是否變化,可以在where后添加篩選條件

SELECT * FOROM T1
  LEFT JOIN 
SELECT * FROM T2
  ON T1.key = T2.key
WHERE 
  T2.key is NULL OR T1.data_key != T2.data_key

對于hive中,是同一張表不同分區,要在left join之前,先把對應兩個分區的數據查出來

(SELECT * FROM TableName where datetime=20200201) T1
  LEFT JOIN 
(SELECT * FROM TableName where datetime=20200202) T2
  ON T1.key = T2.key
WHERE 
  T2.key is NULL OR T1.data_key != T2.data_key

UNION ALL

UNION 命令只會選取不同的值,UNION ALL 會包括全部的值

SELECT col1, col2, col3
FROM
(
  SELECT * FROM tableA
  UNION ALL  
  SELECT * FROM tableB
) data
GROUP BY col1, col2, col3
HAVING count(*)!=2

NOT EXISTS

效率比較低 就不說了

參考資料

quick-best-way-compare-two-tables-sql
sql-set-operator-minus-alternative-in-hive-and-examples
sql-compare-data-from-two-tables
minus-operator-giving-me-erros-in-mysql

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容