hive - 在分区表上插入覆盖不会删除现有数据

标签 hive hiveql hive-partitions

我正在尝试对分区表运行插入覆盖。 insert overwrite 的select 查询完全省略了一个分区。这是预期的行为吗?

表定义

CREATE TABLE `cities_red`(                                                              
  `cityid` int,                                                                         
  `city` string)                                                                        
PARTITIONED BY (                                                                        
  `state` string)                                                                       
ROW FORMAT SERDE                                                                        
  'org.apache.hadoop.hive.ql.io.orc.OrcSerde'                                           
STORED AS INPUTFORMAT                                                                   
  'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'                                     
OUTPUTFORMAT                                                                            
  'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'                                    
TBLPROPERTIES (                                                                         
  'auto.purge'='true',                                                                  
  'last_modified_time'='1555591782',                                                    
  'transient_lastDdlTime'='1555591782');  

表格数据

+--------------------+------------------+-------------------+--+
| cities_red.cityid  | cities_red.city  | cities_red.state  |
+--------------------+------------------+-------------------+--+
| 13                 | KARNAL           | HARYANA           |
| 13                 | KARNAL           | HARYANA           |
| 1                  | Nagpur           | MH                |
| 22                 | Mumbai           | MH                |
| 22                 | Mumbai           | MH                |
| 755                | BPL              | MP                |
| 755                | BPL              | MP                |
| 10                 | BANGLORE         | TN                |
| 10                 | BANGLORE         | TN                |
| 10                 | BANGLORE         | TN                |
| 10                 | BANGLORE         | TN                |
| 12                 | NOIDA            | UP                |
| 12                 | NOIDA            | UP                |
+--------------------+------------------+-------------------+--+

查询

insert overwrite table cities_red partition (state) select * from cities_red where city !='NOIDA';

它不会从表中删除任何数据

insert overwrite table cities_red partition (state) select * from cities_red where city !='Mumbai';

它从表中删除了预期的 2 行。

在分区表的情况下,这是 Hive 的预期行为吗?

最佳答案

是的,这是预期的行为。

Insert overwrite table partition select ,,, 仅覆盖 select 返回的数据集中存在的分区。

在您的示例分区 state=UP 中只有 city='NOIDA' 的记录。过滤器 where city !='NOIDA' 从返回的数据集中删除整个 state=UP 分区,这就是它没有被重写的原因。

过滤器 city !='Mumbai' 不会过滤整个分区,而是部分返回,这就是它被过滤数据覆盖的原因。

它按设计工作。考虑只需要覆盖所需分区的情况,这对于增量分区负载来说是很正常的。在这种情况下,您不需要接触其他分区。 您需要能够正常地只覆盖所需的分区。并且不会覆盖未更改的分区,恢复起来可能非常昂贵。

如果您仍然想删除分区并修改现有分区中的数据,那么您可以删除/创建表(您可能需要为此再创建一个中间表),然后将分区加载到其中。 或者计算您需要单独删除的分区并执行 ALTER TABLE DROP PARTITION

关于hive - 在分区表上插入覆盖不会删除现有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55758708/

相关文章:

hive - 如何使用列的值范围对 Hive 表进行分区

sql - Hive描述扩展表返回json

eclipse 中的 java.lang.ClassNotFoundException : org. apache.hadoop.hive.jdbc.HiveDriver

hadoop - 如何在配置单元中的字符串数据类型以外的列中插入空值而不是 NULL

mysql - hive中使用hadoop的基本sql查询问题

Hive Sql 从表中动态获取空列计数

apache-spark - pyspark - 从 Hive 分区列逻辑获取最新分区

hadoop - 如何更新分桶式和 orc 格式的配置单元表中的多列

hadoop - Hive服务器未启动

hadoop - Hive:在执行选择和同时删除分区配置单元查询时出错