如何使用HIVE比较两个表并返回有差异的行

5

假设我有一张表格,大约有180列和100行记录。 这个表格被备份到一个临时表中,原始表格被删除。 在运行此迁移(更改)后,将对产生相同的表格运行管道。 我想比较备份表格和新表格,并将任何差异的行(记录)移动到第三个表格(_result table),因此我执行以下操作:

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
;

这个查询有错误,我对SQL不是很熟悉,导致出现语法错误,所以无法正确地组合起来。在一个工单上以这种格式提供这个查询明显是错误的。

有谁能看到应该如何做?

谢谢

1个回答

3

必须使用"case when"而非if:

Case When a.title <> b.title then 1 Else 0 End title

我不会写“有”,但表达式要写进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;

"

b.acct_id为空是必需的,因为使用<>会过滤掉这些新记录。

在插入记录时,排序是完全不必要的。

"

请问您能否在where子句中将以下代码的别名更改为a.title <> b.title,而不是a.title <> t.title。我会给您点赞的。 :-) - vikrant rana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接