Spark 手动删除创建分区时指定的location目录导致使用select查询时提示文件不存在

手动删除创建分区时指定的location目录导致使用select查询时提示文件不存在

现象描述

手动删除创建分区时指定的location目录后,导致在使用select语句查询时提示文件不存在的错误,报错信息如下:

0: jdbc:hive2://192.168.169.84:22550/default> select * from tba;
Error: java.io.FileNotFoundException: File hdfs://hacluster/test does not exist. (state=,code=0)

可能原因

手动将HDFS上创建分区时指定的location目录删除后,并没有删除元数据中的分区信息,使用select语句查询时如果此目录不存在就会上报文件不存在的错误。

定位思路

通过show partitions tba;查看tba表的分区信息,发现目录删除后分区的元数据信息依然存在。

0: jdbc:hive2://192.168.169.84:22550/default> show partitions tba;
+----------------------+--+
|        result        |
+----------------------+--+
| date_str=2017-01-12  |
+----------------------+--+

处理步骤

由于HDFS上创建分区时指定的location目录已经删除,此分区下的所有数据信息已经无法恢复,但为了不影响其他分区的正常查询,有以下两个方法:

  • 使用如下命令手动添加报错信息中不存在的location目录: hdfs dfs -mkdir partition_location; 例如:hdfs dfs -mkdir hdfs://hacluster/test;
  • 在用户知道报错信息中location目录所对应的分区的前提下,可以使用如下命令删除数据表中关于此分区的元数据信息: alter table tablename drop partition_desc; 例如:alter table tba drop partition(date_str=’2017-01-12′);

说明:

若存在大量分区,使用mkdir或者drop partition命令会使操作过于繁琐,此时可通过设置参数“spark.sql.hive.verifyPartitionPath”为“true”,对分区路径不存在的分区进行过滤,使得手动删除创建分区时指定的location目录后,使用select语句查询时不会提示文件不存在,但每次会话(session)时都需要重新设置。

关注公众号“大模型全栈程序员”回复“小程序”获取1000个小程序打包源码。更多免费资源在http://www.gitweixin.com/?p=2627

发表评论

邮箱地址不会被公开。 必填项已用*标注