-- 清空分区表 清空hive表 hive分区表清空 清空hive分区表
为什么着重强调分区表,因为分区表清空可能会因为分区过多导致清理速度特别慢.
方式1 truncate table tb1(分区表注意)
注意事项:
truncate table不会删除hdfs 分区文件夹,只会删除parquet文件,所以结果就是一堆分区目录还在,但是下面的parquet文件都被删除了.
truncate table 不止不会删除分区文件夹,而且不会删除hive元数据中存储的分区信息,即hive认为之前的分区还在,spark读取到就会扫描该分区下的文件,没有不报错,但是目录不存在就报错了,这就是为什么手动删除分区文件夹会导致spark2.x报错. spark3变成了警告信息.
通过 show partitions 表名; 来检测hive元数据是否被清空.
使用场景: 分区表的分区不是特别多的场景,比如几百个分区.如果分区太多,那么删除将会分成缓慢.
方式2 复制表结构 删除原表 修改表名(推荐)
有些公司不允许代码新建hive表. eg:sb大华
create table tbnew like tbold;
drop table if exists tbold;
alter table tbnew rename to tbold;
方式3 hadoop删除分区目录 msck修复 (版本号注意)
The MSCK REPAIR TABLE command was designed to manually add partitions that are added to or removed from the file system, such as HDFS or S3, but are not present in the metastore.
可以看文档中写到 msck用来修复你新增或者删除了分区文件,但是没有同步到hive元数据的情况.
坑:
- hive2的msck只能修复新增的分区,手动删除的分区并不会修复到元数据. msck repair table tableName;
- hive3.0.0 (https://issues.apache.org/jira/browse/HIVE-17824)可以: msck repair table tableName sync partitions ; 等效于: ALTER TABLE tableName RECOVER PARTITIONS;
msck官方语法:
MSCK [REPAIR] TABLE table_name [ADD/DROP/SYNC PARTITIONS];
文档: LanguageManual DDL - Apache Hive - Apache Software Foundation
如果你是hive2+spark2 那么方式3会导致你spark任务报错.
如果你是hive3+spark3 那么没问题,但是记得使用 msck的sync模式.
如果我就是用hive2 spark2 但是分区已经被我删除了怎么解决
show partitions partitionedtb1; -- 查看hive元数据里面存储了哪些分区
alter table partitionedtb1 set TBLPROPERTIES('EXTERNAL'='TRUE'); -- 修改为外部表是为了保证删除分区后,数据不会被删除
alter table partitionedtb1 drop if exists partition (dt <> 'null'); -- 注意: 这里虽然文件夹没有,但是他是根据元数据走的,所以你的元数据会被删除.
alter table partitionedtb1 set TBLPROPERTIES('EXTERNAL'='FALSE');
版权归原作者 Thomas2143 所有, 如有侵权,请联系我们删除。