如何更新hive表中的多个列,这些列是以块状格式和orc格式

时间:2016-01-29 09:15:19

标签: hadoop hive cloudera hiveql hortonworks-data-platform

我可以更新单列,但我无法更新从另一个表引用的多个列。

我启用了所有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

2 个答案:

答案 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/

希望这会有所帮助......