当前位置: 首页 > 知识库问答 >
问题:

如何更新带扣的orc格式的配置单元表中的多个列

伯英武
2023-03-14

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

我启用了所有ACID属性以支持配置单元(1.2.1)表更新

我有两张桌子,

表1:

模式:

创建表table1(emp_id int,emp_name string,etime timestamp)

数据:

emp_id | emp_name | etime

1|大卫|2016-01-08 12:27:30

约翰2016-01-08 12:27:45

表二

架构:

创建表table2(emp_id int,emp_name string,etime timestamp),由(emp_id)聚集到4个存储桶中,存储为orc TBLProperty('transactional'='true')

数据:

emp_id | emp_name | etime

1 | davi | 2016-01-08 12:02:30

2 |约翰尼| 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

约翰2016-01-08 12:27:45

3 | kiran | 2016-01-08 11:01:36

共有2个答案

孟鸿朗
2023-03-14

在Hive中更新所有列没有意义。Hive不同于RDBMS。如果上面的表是一个10亿行、200列的表,那么这个过程会非常慢,而且不是使用Hive的有效方法。您可以使用Hbase实现这一点,并将数据从Hbase拉入Hive。然而,在Hive中,我用于上述场景的方法是在第二个表中有一个is_valid(Binary)字段。

例子:

表二

架构:

创建表table2(emp_id int,emp_name string,etime timestamp,is_vald boolean),通过(emp_id)将其聚集到4个存储为orc TBLProperty的存储桶中('transactional'='true');

数据:

emp|u id | emp|u name | etime |有效吗

1 | davi | 2016-01-08 12:02:30 |正确

2 |约翰尼| 2016-01-08 11:20:45 |正确

3|基兰|2016-01-08 11:01:36|真

使用左向外连接来识别更改的记录(我建议在这里使用视图)

创建视图更新_emp_id_vw作为选择t1。表1 t1中的emp_id在t1上左半连接表2 t2。emp_id=t2。emp_id

插入表2从表1中选择emp_id,emp_name,etime,trueemp_id(从update_emp_id_vw中选择emp_id)

表2:

emp|u id | emp|u name | etime |有效吗

1 | davi | 2016-01-08 12:02:30 |假

2 |约翰尼| 2016-01-08 11:20:45 |假

3|基兰|2016-01-08 11:01:36|真

1 |大卫| 2016-01-08 12:27:30 |对

2 |约翰| 2016-01-08 12:27:45 |对

稍后,您只能查询_valid=true的字段。如果您不希望表2中的历史记录,可以删除其中为_valid=false的行。

您还可以实现其他几个逻辑。如果要将其用作缓慢变化的标注,这是一个选项。如果要跟踪历史记录,可以将当前_时间戳字段添加到表2中。(更多信息可在此博客中找到:https://hortonworks.com/html" target="_blank">hadoop-tutorial/using-hive-acid-transactions-insert-update-delete-data/)

希望这有帮助。。。

庄飞
2023-03-14

试试这个:

更新table2 sett2.etime=t1.etime从table2 t2左向外连接table1 t1t1.emp_id=t2.emp_idt1.emp_id不为空

 类似资料:
  • 我有一些困难,以确保我利用已排序的数据在一个配置单元表。(使用ORC文件格式) 我知道我们可以通过在create DDL中声明子句来影响数据从配置单元表中读取的方式。 这意味着每次查询该表时,数据将通过在各个映射器之间分发,然后对其进行排序。 我的问题是: 我不希望数据被拆分为文件(桶),因为卷不是那么多,我会保留小文件。 但是,我确实想利用排序插入。 我真的需要在create DLL语句中使用吗

  • 注意:我没有在该表上应用任何分区或桶,如果应用桶,我甚至无法查看存储为ORC Hive版本:1.2.1 Spark版本:1.4.1 Scala版本:2.10.6的数据

  • 我有一个配置单元表保存在ORC文件中,这是“create”命令中的定义: 我想从末尾删除一个列,所以我尝试了“alter table-replace columns”命令,在这里我没有写列名--但是得到了这个错误:

  • 我在Hive有一个分区的兽人表。加载所有可能的分区后,我在HDFS上得到多个ORC文件,即HDFS上的每个分区目录中都有一个ORC文件。我需要将每个分区下的所有这些ORC文件组合成一个大的ORC文件,用于某些用例。 有人能给我建议一个方法,把这些多个ORC文件(属于每个分区)组合成一个单一的大ORC文件。 我试着从分区表创建一个新的非分区ORC表。它确实减少了文件的数量,但不会减少到单个文件。 p

  • 然后我再输入100条记录到这个表中,新的100条记录会被追加到最后的条带中还是会创建一个新的条带? 我试着在HDFS集群上测试它,似乎每次我们插入新记录时,都会创建一个新文件(当然,也会创建新条带)。想知道为什么?