【问题标题】:Does Insert Overwrite deletes the data and partition in hive?插入覆盖是否会删除配置单元中的数据和分区?
【发布时间】:2019-04-14 22:52:35
【问题描述】:
我正在按年和月创建分区。假设目标 hive 表中存在的先前分区是 year = 2018 and month = 10 and month = 11。现在新数据即将到来,只有year = 2018 and month = 11。
所以我的问题是插入覆盖删除month = 10 的数据和分区吗?
请建议我一个解决方案,因为我也想删除 month = 10 的数据和分区。
谢谢
【问题讨论】:
标签:
hive
partitioning
overwrite
【解决方案1】:
当 Hive 尝试“INSERT OVERWRITE”到现有目录下的外部表的分区时,取决于分区定义是否已存在于元存储中,Hive 的行为会有所不同:
a) 如果分区定义不存在,它不会尝试猜测目标分区目录在哪里(静态或动态分区),因此将无法删除那些将写入的分区下的现有文件
b) 如果分区定义确实存在,它将尝试删除目标分区目录下的所有文件,然后再将新数据写入这些目录。
所以简而言之,在你的情况下,它不会删除数据。
【解决方案2】:
如果您想删除所有现有分区并只保留新月份的数据,您可以使用带有比较器的DROP PARTITION 命令。
例如:如果有 2018 年和第 10 个月及之前的分区。您可以使用任一配置
// If there is always only one partition
alter table part_t drop partition (year=2003,month=1);
// If there are multiple partitions, you can use < comparator
alter table part_t drop partition (year <2003,month<1);