【发布时间】:2018-07-06 09:25:33
【问题描述】:
如何在 hive 中比较两个具有相同结构的表。我相信减号在蜂巢中不起作用。
SRC 表:
id name
1 A
2 B
3 C
TGT 表:
身份证名称
1 A
2 C
3 C
谁能帮我查询一下。
【问题讨论】:
如何在 hive 中比较两个具有相同结构的表。我相信减号在蜂巢中不起作用。
SRC 表:
id name
1 A
2 B
3 C
TGT 表:
身份证名称
1 A
2 C
3 C
谁能帮我查询一下。
【问题讨论】:
如果您正在寻找两个表之间的相等性和差异(如果有),您可以执行以下操作
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
上述查询的作用基本上如下,
合并两个表中的所有记录并按所有列对它们进行分组。稍后仅打印出那些唯一的记录 [count(*) = 1]。
如果上述查询打印零记录,则表示两个表完全相等
对于上面你列出的例子,输出如下,
[ TBL_NAME | ID | NAME ]
----------------------------
[ SRC_TABLE | 2 | B ]
[ TGT_TABLE | 2 | C ]
致谢:我从website 中找到了上述解决方案。我试过了,太棒了!
【讨论】:
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 可能不唯一,则应添加附加条件
【讨论】:
要对 2 个表进行全面比较,我的经验告诉我,使用一些校验和机制是比加入表更有效和可靠的解决方案(例如,当键重复时会带来一些困难)。
您可以查看这个处理 Hive 表比较(比较所有行和所有列)的 Python 程序,并会在网页中向您显示可能出现的差异:https://github.com/bolcom/hive_compared_bq
【讨论】:
有一个免费工具 (dataq.io) 可用于比较 hive 中两个表之间的数据。它可以直观地显示差异。
免责声明:我为 dataq.io 工作
【讨论】:
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 B。对吗?