Sql 在配置单元中比较两个表是否相等

Sql 在配置单元中比较两个表是否相等,sql,join,hive,left-join,hiveql,Sql,Join,Hive,Left Join,Hiveql,我有两张桌子,表一和表二。每个都有相同的列: key, c1, c2, c3 我想检查这些表是否彼此相等,因为它们有相同的行。到目前为止,我有两个查询=在配置单元中不相等: 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

我有两张桌子,表一和表二。每个都有相同的列:

key, c1, c2, c3
我想检查这些表是否彼此相等,因为它们有相同的行。到目前为止,我有两个查询=在配置单元中不相等:

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

所以我的想法是,如果返回零计数,那么表是相同的。但是,第一个查询的计数为零,第二个查询的计数为非零。它们到底有什么不同?如果有更好的检查方法,请一定告诉我。

如果要检查重复项,并且表的结构完全相同,并且表中没有重复项,则可以执行以下操作:

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;
如有必要,可以通过多种方式放宽第一段中的条件

请注意,此版本在列具有空值时也有效。这些可能会导致数据出现问题。

使用减号运算符:

SELECT count(*) FROM
  (SELECT t1.c1, t1.c2, t1.c3 from table1 t1
    MINUS
  SELECT t2.c1, t2.c2, t2.c3 from table2 t2)

第一个不包括t1.c1、t1.c2、t1.c3、t2.c1、t2.c2或t2.c3为空的行。这意味着您可以有效地进行内部连接

第二个将查找t1中存在但t2中不存在的行

若要查找t2中存在但t1中不存在的行,可以执行完全外部联接。以下SQL假定所有列都不是空的:

另一种变体

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 )
试用条款:

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

我建议您不要使用任何联接来尝试比较表:

当表很大时,这是一个相当昂贵的操作,这在Hive中经常发生 当重复某些行/连接键时,可能会出现问题 而且,当数据位于不同的集群/数据中心/云中时,它也可能不实用

相反,我认为使用校验和方法并比较两个表的校验和是最好的

我开发了一个Python脚本,允许您轻松地进行此类比较,并查看webbrowser中的差异:


我希望这能帮助你

一个简单的解决方案是进行内部连接。假设我们有两个蜂箱表,即表1和表2。这两个表都有相同的列,即col1、col2和col3。行数也应该相同。那么命令如下

**

**


如果输出值与表1和表2中的行数相同,则所有列都具有相同的值,但如果输出计数小于某些不同的数据。

首先获取表C1和C2的计数。C1和C2应该相等。C1和C2可通过以下查询获得

select count(*) from table1
如果C1和C2不相等,则表不相同

2:查找表DC1和DC2的不同计数。DC1和DC2应该相等。使用以下查询可以找到不同记录的数量:

select count(*) from (select distinct * from table1)
如果DC1和DC2不相等,则表不相同

3:现在获取通过对两个表执行并集获得的记录数。设为U。使用以下查询获取2个表的并集中的记录数:

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

如果两个表的distinct count等于通过执行两个表的并集而获得的记录数,则可以说这两个表中的数据是相同的。ie DC1=U和DC2=U

好的,最好的方法是计算每个表的哈希和,并比较哈希和。 因此,无论它们有多少列,无论它们是什么数据类型,只要这两个表具有相同的模式,就可以使用以下查询进行比较:

select sum(hash(*)) from t1;
select sum(hash(*)) from t2;

您只需要比较返回值。

这样可以检查重复项,但如何确保表匹配?假设表1有第1,2,3,4行,表2有第1,2,3,5行。由于cnt=1,此查询将同时返回这两行吗@GordonLinoff@Danzo . . . 对此查询将返回其他表中不匹配的所有行。您可以将其设置为子查询并进行计数*以查看是否存在此类行。您知道如何在HIVEQL中执行此操作吗@这就是为什么我需要更多的咖啡。。。HiveQL中没有减号运算符,您必须使用@Klas Lindbäck建议的完整外部联接。对于第一个联接,如果我知道所有列都不为null,这是否意味着它检查表是否相等?我不完全确定你第一次发言的含义@KlasLindback@Danzo是的,其中一个表没有空值就足够了。当两个表中的一个条目列都为空时,它会失败,有什么办法解决这个问题吗?不仅要计算键是否匹配,还要计算c1中的值,如果我可以在pyspark中使用它?
select count(*) from (select distinct * from table1)
SELECT count (*)
 FROM 
    (SELECT *
    FROM table1
    UNION
    SELECT *
    FROM table2)
select sum(hash(*)) from t1;
select sum(hash(*)) from t2;