如何更新配置单元表中的值?

Posted

技术标签:

【中文标题】如何更新配置单元表中的值?【英文标题】:How to UPDATE a value in hive table? 【发布时间】:2021-01-11 10:00:15 【问题描述】:

我在 Hive 表中有一个标志列,我想在一些处理后更新它。我尝试使用下面的查询使用 hive 和 impala,但它没有用,并且知道它需要是一个 kudu 表,而我拥有的表是一个非 kudu 表。有没有办法像下面的查询一样更新它?

UPDATE table_name SET flag_col = 1
where [condition];

【问题讨论】:

【参考方案1】:

用计算值覆盖整个表,所有其他列原样:

insert overwrite table table_name 
select col1, col2, ..., coln, 
       case when [condition] then 1 else flag_col end as flag_col,
       colO, 
       colP...
  from table_name ;

有关分区表等的更多详细信息,请阅读文档:https://docs.cloudera.com/documentation/enterprise/5-8-x/topics/impala_insert.html

【讨论】:

感谢您的回答。但是如您所知,我可以使用 INSERT OVERWRITE 并根据条件仅覆盖特定值吗?例如,我只想更新特定日期的标志?另请注意,如果有帮助,我有 3 个条件可以匹配 @OmarAlSaghier 有什么不同?按原样选择所有列,但需要更新的列除外。对于您需要更新的所有列,使用所有条件编写条件表达式,无论有多少条件。并保持列的顺序与目标表中的相同 我明白了你的意思.. 但我遇到了 [condition] 的问题,因为它匹配另一个表中的值,例如:Select * CASE WHEN table1.col1 = table2.col1 和 table1。 col2 = table2.col2 THEN 1 ELSE falg END AS flag from table1, table2.. 但是像这样,我得到了数十亿个重复项。当我尝试使用恒定值时,它起作用了。请问您有什么想法吗? @OmarAlSaghier 正确连接表:` from table1 JOIN table2 on ` 只有你知道哪些可能的连接键不会重复。没有连接,如果你从 table1 写,table2 它是交叉(笛卡尔)积 @OmarAlSaghier 最好从两个表中准备一些数据示例,目前尚不清楚。如果要检查 table2 中是否存在数据,请在 上使用 LEFT JOIN 并在 CASE 中检查 t2 中的某些键列是否不为空(已连接)【参考方案2】:

Hive 不支持更新(或删除),但它支持 INSERT INTO,因此可以向现有表添加新行。

> insert overwrite table table_name 
> select *,
 case when [condition] then 1 else flag_col end as flag_col,
 from table_name 

//If you want to use you can add where// > where id <> 1;

【讨论】:

Pefect .. 感谢您的帮助,但我认为我需要重写所有列的名称,因为 * 然后 CASE 会添加一个我认为的新列

以上是关于如何更新配置单元表中的值?的主要内容,如果未能解决你的问题,请参考以下文章

如何从其他表中更新表中的值

Excel VBA如何填充不同工作表中的值

如何将一个表中的值插入另一个表,然后更新原始表?

如何根据oracle中另一个表中的值更新一个表中的字段[重复]

从背景更新过滤表中的单元格?

如何将按月分区的配置单元表中的数据加载到按周分区的配置单元表中