如何比较两个表并返回与HIVE不同的行

Jak*_*Zak 5 sql hadoop hive compare nosql

因此,可以说我有一个包含约180列和100条记录的表。将该表备份到临时表中,并删除原始表。在迁移(更改)之后,在生成相同表的管道上运行。我想将备份的表与新的adn行(记录)进行比较,并将任何差异移到第三表(_result表),所以我这样做:

INSERT OVERWRITE TABLE
  zakj_customers.customers_detail_result
SELECT
  acct_id, IF (a.title != b.title, 1, 0) title, IF (a.fname != b.fname, 1, 0) fname, IF (a.dob != b.dob, 1, 0) dob, IF (a.cr_date != b.cr_date, 1, 0) cr_date
FROM
  zakj_customers.customers_detail a
LEFT OUTER JOIN
  zakj_customers.customers_detail_backup b
ON
  (a.acct_id = b.acct_id)
ORDER BY 
  title DESC,fname DESC,dob DESC,cr_date DESC
HAVING
  title > 0 AND fname > 0 AND dob > 0 AND cr_date > 0
;
Run Code Online (Sandbox Code Playgroud)

因此,无视此查询是错误的,我对SQL的了解不多,并且遇到语法错误,因此无法正确地将其组合在一起,并且在以这种格式提供的票证上,这显然是错误的。

谁能看到实现此目的的方式?

干杯

Pet*_*soi 3

必须使用“case when”而不是 if:

Case When a.title <> b.title then 1 Else 0 End title
Run Code Online (Sandbox Code Playgroud)

我不会将having 写入where 条件中,而是将表达式写入其中:

INSERT Into
  zakj_customers.customers_detail_result
SELECT
  acct_id, a.title, a.fname, dob, a.cr_date
FROM
  zakj_customers.customers_detail a
LEFT OUTER JOIN
  zakj_customers.customers_detail_backup b
ON
  (a.acct_id = b.acct_id)
Where b.acct_id is null or a.title <> b.title or a.fname <> b.fname or a.cr_date <> b.cr_date;
Run Code Online (Sandbox Code Playgroud)

需要“b.acct_id is null”才能获取新记录,因为 <> 会过滤掉它们。

(插入记录时完全不需要排序。)