在HIVE中比较两个表

4

我有三个Hive表:

  • Control_table,包含已知数据
  • New_table,包含需要检查的数据
  • Result_table,用于插入New_table与Control_table中值不同的记录

这三个表都具有相同的列名(出于安全原因,我不会展示列名)和列数,它们分别是:

c1, c2, c3, c4, c5, c6, c7

c1是主键。

现在我需要编写HIVE的SQL查询来比较两个表(control_table和new_table),并将具有不同值的行移动到结果表中。现在,结果表与new_table或control_table具有相同数量的列。如果可能,我希望只填充实际不同的列。

例如:

Control_table:  c1  | c2 | c3 | c4 | c5 | c6 | c7 |

With a values:  11  | 22 | 33 | 44 | 55 | 66 | 77 |

New_table:   c1 | c2 | c3 | c4 | c5 | c6 | c7 |

With values: 11 | 21 | 33 | 44 | 54 | 66 | 87 |

将它们进行比较并将结果插入到result_table中,那么result_table将会如下所示:
Result_table:  c1 | c2 | c3 | c4 | c5 | c6 | c7 |

With values:   11 | 21 | -- | -- | 54 | -- | 87 |

只有实际差值的列才会被填充。
我对SQL一窍不通,尝试了几种方法并在这里提问,但从未得到好的答案。以下是我的先前答案链接,其中还包含SQL示例: 如何比较两个表并返回具有HIVE差异的行 注:可能无法实现,因为我没有使用NoSQL的经验。
2个回答

4

根据您的需求修改以下内容:

SELECT nt.c1,
       CASE WHEN ct.c2 <> nt.c2 THEN '--' ELSE  nt.c2 END,
       CASE WHEN ct.c3 <> nt.c2 THEN '--' ELSE  nt.c3 END
FROM 
New_table nt
JOIN Control_table ct ON nt.c1 = ct.c1
WHERE
ct.c2 <> nt.c2 OR ct.c3 <> nt.c3

1
虽然您已经提到修改您的代码,但是仍然需要交换then和else的值以匹配原始问题的答案。 - gitesh.tyagi
@www- 为什么你在连接语句中添加了where子句?WHERE ct.c2 <> nt.c2 OR ct.c3 <> nt.c3...我们能否在没有这个where语句的情况下得到所需的结果? - vikrant rana
1
@vikrantrana 我只是为了更清晰地表达加入了它,如果您希望使用JOIN,请随意这样做。 - www

-1
select * from Control_table    
full outer join New_table     
on Control_table.c1=New_table.c1     
where Control_table.c1 is null  or  New_table.c1 is null;    

如果任何记录与两个表中的任何一个不匹配,则会获取这些记录。您可以进行表数据验证。如果您想将其存储到其他表中,请执行以下操作:
使用以下命令创建托管表:

CREATE TABLE RESULT_TABLE AS SELECT * FROM Control_table;   

并将结果加载到此结果表中:

INSERT INTO TABLE RESULT_TABLE     
select * from Control_table full outer join New_table on     
Control_table.c1=New_table.c1    
 where Control_table.c1 is null    
or  New_table.c1 is null;

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