在分区 table 上插入覆盖不会删除现有数据
Insert overwrite on partitioned table is not deleting the existing data
我正在尝试 运行 在分区 table 上插入覆盖。
select insert overwrite 查询完全省略了一个分区。这是预期的行为吗?
Table定义
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');
Table数据
+--------------------+------------------+-------------------+--+
| 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';
它不会从 table
中删除任何数据
insert overwrite table cities_red partition (state) select * from cities_red where city !='Mumbai';
它从 table 中删除了预期的 2 行。
在分区 tables 的情况下,这是 Hive 的预期行为吗?
是的,这是预期的行为。
Insert overwrite table partition select ,,,
仅覆盖 select.
返回的数据集中存在的分区
在您的示例分区 state=UP
中只有 city='NOIDA'
的记录。过滤器 where city !='NOIDA'
从返回的数据集中删除整个 state=UP
分区,这就是它没有被重写的原因。
过滤器 city !='Mumbai'
不过滤整个分区,它被部分返回,这就是它被过滤数据覆盖的原因。
它按设计工作。考虑只需要覆盖所需分区的情况,这对于增量分区负载来说是很正常的。在这种情况下,您不需要接触其他分区。 您需要能够正常覆盖所需的分区。并且不会覆盖未更改的分区,恢复起来可能非常昂贵。
如果你仍然想删除分区并修改现有分区中的数据,那么你可以drop/create table(你可能需要为此再创建一个中间table)然后将分区加载到其中。
或者计算您需要单独删除的分区并执行 ALTER TABLE DROP PARTITION
.
我正在尝试 运行 在分区 table 上插入覆盖。 select insert overwrite 查询完全省略了一个分区。这是预期的行为吗?
Table定义
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');
Table数据
+--------------------+------------------+-------------------+--+
| 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';
它不会从 table
中删除任何数据insert overwrite table cities_red partition (state) select * from cities_red where city !='Mumbai';
它从 table 中删除了预期的 2 行。
在分区 tables 的情况下,这是 Hive 的预期行为吗?
是的,这是预期的行为。
Insert overwrite table partition select ,,,
仅覆盖 select.
在您的示例分区 state=UP
中只有 city='NOIDA'
的记录。过滤器 where city !='NOIDA'
从返回的数据集中删除整个 state=UP
分区,这就是它没有被重写的原因。
过滤器 city !='Mumbai'
不过滤整个分区,它被部分返回,这就是它被过滤数据覆盖的原因。
它按设计工作。考虑只需要覆盖所需分区的情况,这对于增量分区负载来说是很正常的。在这种情况下,您不需要接触其他分区。 您需要能够正常覆盖所需的分区。并且不会覆盖未更改的分区,恢复起来可能非常昂贵。
如果你仍然想删除分区并修改现有分区中的数据,那么你可以drop/create table(你可能需要为此再创建一个中间table)然后将分区加载到其中。
或者计算您需要单独删除的分区并执行 ALTER TABLE DROP PARTITION
.