
# Hive分区数过多导致删除表失败
#### 问题现象
Hive创建的二级分区表有两万多个分区，导致用户在执行truncate table ${TableName},drop table ${TableName}时失败。
#### 原因分析
删除文件操作是单线程串行执行的，Hive分区数过多导致在元数据数据库会保存大量元数据信息，在执行删除表语句时删除元数据就要用很长时间，最终在超时时间内删除不完，就会导致操作失败。
![](https://support.huaweicloud.com/trouble-mrs/public_sys-resources/note_3.0-zh-cn.png)
超时时间可通过登录FusionInsight Manager，选择"集群 \> 服务 \> Hive \> 配置 \>全部配置 \> MetaStore（角色） \> 服务初始化"查看，"hive.metastore.client.socket.timeout"对应的值即为超时时间时长，在"描述"列可查看默认值。
#### 处理步骤
1. 如果是内部表可以先通过alter table ${TableName} set TBLPROPERTIES('EXTERNAL'='true')来将内部表转成外部表，这样Hive删除的时候只删除元数据省去了删除HDFS数据的时间。
2. 如果要用相同的表名可以先将表结构用show create table ${TableName}来导出表结构，再用ALTER TABLE ${TableName} RENAME TO ${new_table_name};来将表重命名。这样就可以新建一个和原来一样表。
3. 执行hdfs dfs -rm -r -f ${hdfs_path}在HDFS上删除表数据。
4. 在Hive中用alter table ${Table_Name} drop partition (${PartitionName}<’XXXX’, ${PartitionName}>’XXXX’);删除分区(具体删除条件可灵活处理)，减少Temporary文件数。
5. 删除分区少于一千个后，直接用drop table ${TableName}删掉表即可。
 
#### 建议与总结
Hive分区虽然可以提高查询效率，但要避免分区不合理导致出现大量小文件的问题，要提前规划好分区策略。
