如何比较hive中具有相同结构的两个表。我相信减去不会在蜂巢中起作用。
SRC表:
id name
1 A
2 B
3 C
TGT表:
id name
1 A
2 C
3 C
任何人都可以帮我查询。
答案 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工作