我可以更新单列,但我不能更新从另一个表引用的多列。
我启用了所有 ACID 属性以支持 hive (1.2.1( 表更新。
我有两张桌子,
表1:
图式:
创建表表1(emp_id int,emp_name 字符串,电子时间戳(;
数据:
emp_id | emp_name | 易泰
1 | David| 2016-01-08 12:27:30
2 | John | 2016-01-08 12:27:45
表2
图式:
创建表表2(emp_id int,emp_name 字符串,etime 时间戳( 由 (emp_id( 集聚到 4 个存储为 orc TBLPROPERTIES('事务'='true'(的存储桶中;
数据:
emp_id | emp_name | 易泰
1 | davi | 2016-01-08 12:02:30
2 | Johny | 2016-01-08 11:20:45
3 | kiran | 2016-01-08 11:01:36
现在我想根据 table2 数据更新 table1 中的所有列,例如比较两个表的emp_id。我想要如下输出
表2:
emp_id | emp_name | 易泰
1 | David| 2016-01-08 12:27:30
2 | John | 2016-01-08 12:27:45
3 | kiran | 2016-01-08 11:01:36
试试这个:
更新表2设置 t2.etime = t1.etime从表2 T2左外连接表1 T1 上 t1.emp_id = t2.emp_id其中t1.emp_id不为空
在 Hive 中更新所有列没有意义。Hive与RDBMS不同。如果你上面的表格是十亿行,200 列的表,那么这个过程将非常慢,而不是使用 Hive 的有效方式。您可以使用 Hbase 并将数据从 Hbase 拉取到 Hive 中。但是,在 Hive 中,我用于上述方案的方法是在第二个表中有一个is_valid(二进制(字段。
例:
表2
图式:
创建表 table2(emp_id int,emp_name 字符串,etime 时间戳,is_vald布尔值(集聚(emp_id(分组到 4 个存储为 orc TBLPROPERTIES 的存储桶中('事务'='true'(;
数据:
emp_id | emp_name | etime | is_valid
1 | davi | 2016-01-08 12:02:30 | 真
2 | Johny | 2016-01-08 11:20:45 | 真
3 | kiran | 2016-01-08 11:01:36 | 真
使用左外部联接来标识已更改的记录(我建议在此处使用视图(
创建视图update_emp_id_vw作为 从表1中选择t1.emp_id T1 左半连接表2 T2 在t1.emp_id = t2.emp_id
更新表2 设置is_valid=emp_id的 flase(从update_emp_id_vw中选择emp_id(
插入到表2从表 1 中选择 emp_id 、emp_name 、etime 、true emp_id(从update_emp_id_vw中选择emp_id(
表2:
emp_id | emp_name | etime | is_valid
1 | davi | 2016-01-08 12:02:30 | 假
2 | Johny | 2016-01-08 11:20:45 | 假
3 | kiran | 2016-01-08 11:01:36 | 真
1 | 大卫 | 2016-01-08 12:27:30 | 真
2 | John | 2016-01-08 12:27:45 | 真
稍后,您只能查询 is_valid = true 的字段。如果您不希望 table2 中的历史记录,可以删除 is_valid = false 的行。
您还可以实现其他几个逻辑。如果要将其用作缓慢变化的维度,则此选项。如果要跟踪历史记录,可以将current_timestamp字段添加到 table2。(更多信息可以在此博客中找到:https://hortonworks.com/hadoop-tutorial/using-hive-acid-transactions-insert-update-delete-data/(
希望这有帮助...