假設這裡出錯的表為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')
把對應的分割槽也刪除掉就可以了。
如果已經刪除了分割槽目錄,也需要執行上以上的命令。