比较两个表格以确定HIVE的平等性

时间:2015-08-04 11:55:28

标签: sql join hive left-join hiveql

我有两个表,table1和table2。每个都有相同的列:

class sign_up_form_school(forms.Form):
    states = forms.ModelChoiceField(
        queryset = States.objects.all(), 
        widget=forms.Select(attrs={
          'class': states.country_id.name #is this POSSIBLE?
          }))

我想检查一下这些表是否相等(它们具有相同的行)。到目前为止,我有两个查询(<> =在HIVE中不相等):

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

所以我的想法是,如果返回零计数,表格是相同的。但是,我第一次查询的计数为零,第二次查询的计数为非零。他们究竟有何不同?如果有更好的方法来检查这一点,请告诉我。

10 个答案:

答案 0 :(得分:12)

第一个排除了t1.c1,t1.c2,t1.c3,t2.c1,t2.c2或t2.c3为空的行。这意味着您有效地进行内部联接。

第二个会找到存在于t1但不存在于t2中的行。

要查找t2中但不存在于t1中的行,您可以执行完全外部联接。以下SQL假定所有列均为NOT NULL

select count(*) from table1 t1
full outer join table2 t2
on t1.key=t2.key and t1.c1=t2.c1 and t1.c2=t2.c2 and t1.c3=t2.c3
where t1.key is null /* this condition matches rows that only exist in t2 */
   or t2.key is null /* this condition matches rows that only exist in t1 */

答案 1 :(得分:5)

如果要检查重复项,表格具有完全相同的结构,表格中没有重复项,那么您可以这样做:

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;

如有必要,您可以通过各种方式放宽第一段中的条件。

请注意,当列具有NULL值时,此版本也可以使用。这些可能会导致您的数据出现问题。

答案 2 :(得分:1)

嗯,最好的办法就是计算每张表的hash和,比较hash的总和。 所以不管有多少列,不管是什么数据类型,只要两个表的schema相同,就可以使用如下查询进行比较:

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

你只需要比较返回值。

答案 3 :(得分:0)

另一种变体

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 )

答案 4 :(得分:0)

尝试使用WITH子句:

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

答案 5 :(得分:0)

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

  • 当表格很大时(在Hive中经常出现这种情况),这是一项相当昂贵的操作。
  • 当某些行/&#34;加入密钥时会出现问题&#34;重复

(当数据位于不同的群集/数据中心/云中时,它也可能不实用。)

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

我开发了一个Python脚本,可以让您轻松进行这样的比较,并查看webbrowser中的差异:

https://github.com/bolcom/hive_compared_bq

我希望能帮到你!

答案 6 :(得分:0)

一个简单的解决方案是进行内部联接。假设我们有两个配置单元表table1和table2。两个表都有相同的列,即col1,col2和col3。行数也应该相同。然后命令如下

**

select count(*) from table1 
inner join table2 
on  table1.col1 = table2.col1 
and table1.col2 = table2.col2
and table1.col3 = table2.col3 ;

**

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

答案 7 :(得分:0)

表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:现在获得通过对2个表执行联合获得的记录数。设为U。使用以下查询获取2个表的并集中的记录数:

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

如果两个表的不同计数等于通过执行两个表的并集获得的记录数,则可以说两个表中的数据相同。即DC1 = U且DC2 = U

答案 8 :(得分:0)

我使用了 EXCEPT 语句并且它起作用了。

select * from Original_table
EXCEPT
select * from Revised_table

将向我们显示原始表中不在修订表中的所有行。

如果您的表已分区,则必须提供分区谓词。 仅供参考,如果您使用 Presto 并通过 SQL lab 查询,则不需要提供分区值。

答案 9 :(得分:-2)

使用MINUS运算符:

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