我可以更新单列,但我无法更新从另一个表引用的多个列。
我启用了所有ACID属性以支持hive(1.2.1)表更新。
我有两张桌子,
表1:
架构:
create table table1(emp_id int,emp_name string,etime timestamp);
数据:
emp_id | emp_name | etime
1 |大卫| 2016-01-08 12:27:30
2 |约翰| 2016-01-08 12:27:45
表2
架构:
创建表table2(emp_id int,emp_name字符串,etime时间戳)将(emp_id)聚集成4个桶存储为orc TBLPROPERTIES('transactional'='true'); < / strong>
数据:
emp_id | emp_name | etime
1 |大卫| 2016-01-08 12:02:30
2 | johny | 2016-01-08 11:20:45
3 | kiran | 2016-01-08 11:01:36
现在我想基于table1数据更新table2中的所有列,例如比较两个表的emp_id。我希望输出如下
表2:
emp_id | emp_name | etime
1 |大卫| 2016-01-08 12:27:30
2 |约翰| 2016-01-08 12:27:45
3 | kiran | 2016-01-08 11:01:36
答案 0 :(得分:0)
试试这个:
更新table2 设置t2.etime = t1.etime 来自table2 t2 左外连接table1 t1在t1.emp_id = t2.emp_id上 其中t1.emp_id不为空
答案 1 :(得分:0)
更新所有列在Hive中没有意义。 Hive与RDBMS不同。如果您的上表是十亿行,200列表,那么该过程将是超级慢并且不是使用Hive的有效方式。您可以使用Hbase并将数据从Hbase拉入Hive。 但是,在Hive中,我用于上述场景的方法是在第二个表中使用is_valid(二进制)字段。
示例:
表2
架构:
创建表table2(emp_id int,emp_name字符串,etime时间戳, is_vald boolean )将(emp_id)集群设置为4个存储为orc TBLPROPERTIES的存储桶(&#39; transactional&#39; =& #39;真&#39);
数据:
emp_id | emp_name | etime | is_valid
1 |大卫| 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 as table t1.emp_id from table1 t1 left half join table2 t2 on t1.emp_id = t2.emp_id
更新table2 set is_valid = flase其中emp_id in(从update_emp_id_vw中选择emp_id)
插入table2 从table1中选择emp_id,emp_name,etime,true,其中emp_id在(从update_emp_id_vw中选择emp_id)
表2:
emp_id | emp_name | etime | is_valid
1 |大卫| 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 |约翰| 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/)
希望这会有所帮助......