在hive中,會有這樣一種情形:
1、創建一個分區外部表A(比如A表有5個字段),並且向A表里指定的分區(比如20160928這個分區)里插入數據
2、發現A表缺少一些字段,因為存在元數據不實時更新的問題,不想更新元數據,就進行刪表重新建表B(表B與表A除了多了幾個字段外,別的都一樣)
3、再執行hql腳本,把最新的字段樣式的數據插入到20160928這個分區里
會出現如下的報錯:
Failed with exception java.io.IOException: rename for src path: hdfs://bdc/are_wek/date=20160928/.hive-staging_hive_xxxxxx-1/-ext-10000/000000_0 to dest path:hdfs://bdc/are_wek/date=20160928/000000_0 returned false
FAILED: Execution Error, return code 1 from
org.apache.hadoop.hive.ql.exec.MoveTask. java.io.IOException:
rename for src path: hdfs://bdc/are_wek/date=20160928/.hive-staging_hive_xxxxxxx-1/-ext-10000/000000_0 to dest path:hdfs://bdc/are_wek/date=20160928/000000_0
returned false
這個錯誤是指hadoop在把hql執行結果從臨時文件挪到對應的表所在的目錄時出錯;
出現這個問題的原因是:
1、我只是drop了表,其實只是刪除了表的元數據,但是表對應的數據文件依然還在hdfs上;
2、hive在把臨時文件挪移到正式目錄時,會先對hdfs上的文件做一個判斷,如果文件夾不存在那就創建,如果存在那就直接把文件挪移過去,這樣就等於把臨時文件夾里的000000_0文件挪到正式目錄下,這時候正式目錄已經有了一個叫000000_0的文件,所以就會報如上的錯誤
解決辦法:
hadoop fs -rmr /bdc/are_wek/date=20160928/*
把對應的數據文件刪除即可