我们的hadoop集群存在数据损坏问题。我们在配置单元上有一个托管表,其中包含按年份划分的三年数据。
下面两个查询运行良好,没有任何问题
select count(*) from tkt_hist table where yr=2015
select count(*) from tkt_hist table where yr=2016
select count(*) from tkt_hist table where yr=2017
然而,当我们尝试每年分组时,下面显示了错误。
Error while compiling statement: FAILED: SemanticException java.io.FileNotFoundException: File hdfs://ASIACELLHDP/apps/hive/warehouse/gprod1t_base.db/toll_tkt_hist_old/yr=2015/mn=01/dy=01 does not exist. [ERROR_STATUS]
当我们指定2015年以外的年份时,即使选择也不起作用。
//this works fine
Select * from tkt_hist where yr=2015 limit 10;
// below throws same error mentioned above.
Select * from tkt_hist where yr=2016;
2条答案
按热度按时间tkqqtvp11#
您必须手动删除分区,因为
msck repair table
只添加分区,不删除现有分区。您必须遍历损坏的分区列表。对于内部表,必须是特定的,因为删除分区会删除底层物理文件。
ALTER TABLE tkt_hist DROP IF EXISTS PARTITION(yr=2015, mn=01, dy=01);
您需要为每个分区执行此操作。您可以将其放入bash脚本中,并使用hive -e
或者beeline -e
使用带引号的查询字符串的命令。如果您使用的是外部表,那么删除所有分区然后修复表就容易多了。
ALTER TABLE tkt_hist DROP IF EXISTS PARTITION(yr<>'', mn<>'', dy<>'');
确保以拥有hivedb和hdfs路径的用户身份修复表。MSCK REPAIR TABLE tkt_hist;
这将添加表路径中当前可用的分区文件夹,而不添加无效分区。注意:如果您的用户不是目录的所有者,请确保您具有写入权限并在
hive
作为访问客户端beeline
工作需要绝对所有权。qgzx9mmu2#
尝试增加java堆空间(如果不起作用,则增加reducer内存)。
例如: