最近遇到了刷數(shù)據(jù)的場景砂吞,每天產(chǎn)出的原始數(shù)據(jù)大概有4億條,4億條數(shù)據(jù)刷到在線服務(wù)中崎溃,平均qps也有5k左右了蜻直,意義不是很大,考慮到數(shù)據(jù)也不是每天都在變袁串,于是產(chǎn)生了查diff的需求概而。
MINUS
在搜索引擎上一搜,很容易就看到了可以用MINUS
實現(xiàn)
SELECT * FROM T1
MINUS
SELECT * FROM T2
可惜無論 MySQL 還是 Hive 都不支持囱修。
Left Join
Left Join 保證了左表的數(shù)據(jù)一定會存在赎瑰,對于這類查Diff的場景很合適
下面這個語句可以查出來 T2中比T1新增的列
key代表表示唯一信息的那一列,例如用戶ID之類
SELECT * FOROM T1
LEFT JOIN
SELECT * FROM T2
ON T1.key = T2.key
WHERE
T2.key is NULL
如果還想關(guān)注 某一列的指標(biāo)是否變化破镰,可以在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中餐曼,是同一張表不同分區(qū),要在left join之前啤咽,先把對應(yīng)兩個分區(qū)的數(shù)據(jù)查出來
(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