最近遇到了刷數據的場景,每天產出的原始數據大概有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