解決Spark讀取Hive分割槽表出現Input path does not exist的問題

StanZhai發表於2016-12-16

假設這裡出錯的表為test表。

現象

Hive讀取正常,不會報錯,Spark讀取就會出現:

org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: hdfs://testcluster/user/hive/warehouse/....

在hive中執行desc formatted test;然後找到hdfs儲存路徑。然後hdfs dfs -ls <your table path>會發現,報錯的路徑確實不存在。

這也能說明為什麼Spark讀取會報錯,確實找不到那個路徑了。

問題分析

在hive中執行show partitions test,檢視test表對應的所有分割槽。

看了下之前新增過的所有分割槽,發現有個分割槽對應的hdfs目錄不存在了(被人為刪除了,一般是清理歷史資料)。但是這個分割槽並沒有執行alter table test drop partition p=xxx這樣刪除掉,因為即便是不刪除hive也能正常讀取。

但是到Spark這就不行了,Spark載入hive分割槽表資料會根據show partitions中的分割槽去載入,發現目錄缺失就會出錯了。

解決方案

刪除分割槽目錄時,同時執行alter table test drop partition (p='xxx')把對應的分割槽也刪除掉就可以了。

如果已經刪除了分割槽目錄,也需要執行上以上的命令。

相關文章