我在Hive中有两个表,一个外部(X)和一个Hive中的托管(M)。 两个表都具有相同的复杂键列(key_col_a,key_col_b)。
我如何按复杂列计算,第一个表中有多少记录在另一个表中?有多少记录不是?
我想计算一下,应该更新多少条记录(那些在另一个表中具有相同复杂键的记录)以及应该插入多少条记录(那些具有全新密钥的记录,以前看不到)通过使用复杂密钥列?
这对我不起作用:
SELECT count(*)
FROM table_x tx
LEFT JOIN table_m tm ON
tx.key_col_a = tm.key_col_a AND tx.key_col_b = tm.key_col_b
WHERE tm.key_col_a IS NULL OR tm.key_col_b IS NULL;
有人可以解释这个问题是什么以及如何解决这个问题?
答案 0 :(得分:1)
您正在使用left join
过滤正在where
的表格。结果相当于内连接,这就是没有结果的原因。将查询更改为
SELECT count(case when tm.key_col_a IS NULL OR tm.key_col_b IS NULL then 1 end) as non_matches,
count(tm.key_col_a) as a_matches,
count(tm.key_col_b) as b_matches,
count(case when tm.key_col_a is not null and tm.key_col_b is not null then 1 end) as a_and_b_matches
FROM table_x tx
LEFT JOIN table_m tm ON tx.key_col_a = tm.key_col_a AND tx.key_col_b = tm.key_col_b
答案 1 :(得分:1)
将count()
与case
声明一起使用:
SELECT count(case when tm.key_col_a is null then 1 end) new_rows_cnt,
count(tm.key_col_a) updated_rows_cnt --counts not null
FROM table_x tx
LEFT JOIN table_m tm ON
tx.key_col_a = tm.key_col_a AND tx.key_col_b = tm.key_col_b
;
答案 2 :(得分:0)
我愿意:
SELECT COUNT(*)
,id_a
,id_b
FROM tm
WHERE tm.id_a NOT IN (
SELECT id_a
FROM tx
)
OR tm.id_b NOT IN (
SELECT id_b
FROM tx
)
将为您提供tx上tm丢失事件的数量。