如何更新 Hive 表中的多个列,该表是存储桶和 ORC 格式的



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

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

希望这有帮助...

最新更新