【问题标题】:How to compare two tables and return rows with difference with HIVE如何使用 HIVE 比较两个表并返回不同的行
【发布时间】:2014-10-15 09:48:41
【问题描述】:

假设我有一个包含大约 180 列和 100 条记录的表。 该表被备份到临时表中,原始表被删除。 在生成相同表的管道上运行此迁移(更改)之后。 我想将备份的表与新的行(记录)进行比较,任何差异都将移至第三个表(_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
;

所以忘记了这个查询是错误的,我不太了解 SQL,而且我遇到了语法错误,所以我不能把它正确地放在一起,并且在一张票上它是以这种格式提供的,这显然是错误的。

任何人都可以看到这样做的方式吗?

干杯

【问题讨论】:

    标签: sql hadoop hive compare nosql


    【解决方案1】:

    必须使用“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 is null”是获取新记录所必需的,因为会过滤掉它们。

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

    【讨论】:

    • 能否请您在 where 子句中更改以下代码的别名。 a.title b.title 而不是 a.title t.title .. 为你投票。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多