通过Hive

时间:2018-05-14 13:50:45

标签: sql hive hiveql

我在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;

有人可以解释这个问题是什么以及如何解决这个问题?

3 个答案:

答案 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丢失事件的数量。