比较hive中具有相同结构的两个表之间的数据

时间:2017-02-27 15:42:31

标签: sql hive hiveql

如何比较hive中具有相同结构的两个表。我相信减去不会在蜂巢中起作用。

SRC表:

id name
1   A
2   B
3   C

TGT表:

id name

1   A
2   C
3   C

任何人都可以帮我查询。

5 个答案:

答案 0 :(得分:4)

如果您正在寻找两个表之间的平等以及差异(如果有),您可以执行以下操作

SELECT MIN(TableName) as TableName, ID, NAME FROM ( SELECT 'SRC_TABLE' as TableName, A.ID, A.NAME FROM A UNION ALL SELECT 'TGT_TABLE' as TableName, B.ID, B.NAME FROM B ) tmp GROUP BY ID, NAME HAVING COUNT(*) = 1 ORDER BY ID

基本上,上述查询的作用如下,

  • 合并两张表中的所有记录&按列对所有列进行分组。之后只打印出那些独特的记录[有计数(*)= 1 ]。

  • 如果上述查询打印零记录,则表示这两个表完全相同

  • 如果上述查询完全打印任何记录,则表示这些特定记录不存在于一个或另一个表中
  • 对于上面的示例,您列出的输出如下,

    [ TBL_NAME | ID | NAME ]

    ----------------------------

    [ SRC_TABLE | 2 | B ]

    [ TGT_TABLE | 2 | C ]

致谢:我从website找到了上述解决方案。我试过了,太棒了!

答案 1 :(得分:1)

Hive中不存在减号。您可以使用左连接或完全连接来查找两个表中的不同记录。

LEFT JOIN: - 允许查找TGT中不存在的记录

select a.id, a.name 
  from TGT a left join TGT b on a.id=b.id and a.name=b.name
where b.id is null

使用NOT EXISTS

可以实现同样的目标
select a.id, a.name 
      from TGT a 
where not exists(select 1 from  TGT b where a.id=b.id and a.name=b.name)

FULL JOIN: - 允许查找两个表的差异

select a.id as SRC_ID, a.name as SRC_NAME ,
       b.id as TGT_ID, b.name as TGT_NAME
  from TGT a full join TGT b on a.id=b.id and a.name=b.name
where a.id is null OR b.id is null

答案 2 :(得分:1)

select      id
           ,SRC_name
           ,TGT_name

from       (select      id
                       ,min   (case tab when 'S' then name end) as SRC_name
                       ,min   (case tab when 'T' then name end) as TGT_name
                       ,count (case tab when 'S' then 1    end) as SRC_count 
                       ,count (case tab when 'T' then 1    end) as TGT_count 

            from        (           select 'S' as tab,id,name from SRC
                        union all   select 'T' as tab,id,name from TGT
                        ) t

            group by    id  
            ) t

having      SRC_count = 0
        or  TGT_count = 0
        or  SRC_name != TGT_name
;

如果name可能为NULL或id可能不唯一,则应添加其他条件

答案 3 :(得分:0)

为了对2个表进行全面比较,我的经验告诉我,使用一些校验和机制是一种比连接表更有效和可靠的解决方案(例如,当重复键时会给出一些困难)。

你可以看看这个Python程序来处理Hive表的比较(比较所有行和所有列),并会在网页中显示可能出现的差异:https://github.com/bolcom/hive_compared_bq

答案 4 :(得分:0)

有一个免费工具(dataq.io),可用于比较配置单元中两个表之间的数据。它可以直观地显示差异。

免责声明:我为dataq.io工作