我们的摄取过程有一个问题,会导致分区被添加到配置单元中的表中,但hdfs中的路径实际上并不存在。我们已经解决了这个问题,但是仍然有这些坏分区。当使用tez查询这些表时,我们得到filenotfoundexception,指向hdfs中不存在的位置。如果我们使用mr而不是tez,查询可以工作(这让我很困惑),但是太慢了。
有没有办法列出所有有这个问题的分区? MSCK REPAIR
似乎处理了相反的问题,数据存在于hdfs中,但在hive中没有分区。
编辑:更多信息。以下是文件未找到异常的输出: java.io.FileNotFoundException: File hdfs://<server>/db/tables/2016/03/14/mytable does not exist.
如果我跑了 show partitions <db.mytable>
,我会得到所有的分区,包括一个 dt=2016-03-14
. show table extended like '<db.mytable>' partition(dt='2016-03-14'
返回相同的位置: location:hdfs://server/db/tables/2016/03/14/mytable
.
2条答案
按热度按时间ckx4rj1h1#
好像
MSCK REPAIR TABLE
不会删除指向丢失目录的分区,但会列出这些分区(请参阅Partitions not in metastore:
),因此只需编写一点脚本/手动操作,就可以根据给定的列表删除它们。qlckcl4x2#
MSCK REPAIR TABLE <tablename>
我也面临同样的问题,我找到了解决办法,我们知道'msck repair'命令基于目录添加分区,所以首先删除所有分区
上面的命令删除所有分区,
然后使用
msck repair
命令,然后它将从表位置的目录创建分区。