問題
當你嚐試重新運行Apache火花寫操作被取消當前運行工作,出現以下錯誤:
錯誤:org.apache.spark.sql。AnalysisException:無法創建管理表(“testdb”。testtable”)。相關的位置(“dbfs: / user /蜂巢/倉庫/ testdb。db / metastore_cache_ testtable)已經存在。;
導致
這個問題是由於改變默認行為引發的2.4版。
這個問題會發生如果:
- 集群的終止而正在進行寫操作。
- 一個臨時發生網絡問題。
- 這項工作被打斷了。
一旦metastore數據為一個特定的表損壞,很難恢複除了手動刪除文件的位置。基本上,問題在於一個元數據目錄的地方不會自動刪除當磚試圖覆蓋它。
你可以複製這個問題通過以下步驟:
- 創建一個DataFrame:
val df = spark.range (1000) - 寫DataFrame位置在覆蓋模式下:
df.write.mode (SaveMode.Overwrite) .saveAsTable (“testdb.testtable”) - 取消命令時執行。
- 重新運行寫命令。
解決方案
設置標誌spark.sql.legacy.allowCreatingManagedTableUsingNonemptyLocation來真正的。這個標誌刪除的地方目錄和返回原始狀態的過程。例如,您可以將它設置在筆記本上:
% python spark.conf.set (“spark.sql.legacy.allowCreatingManagedTableUsingNonemptyLocation”,“真正的”)
或者你可以把它在集群級別火花配置(AWS|Azure|GCP):
spark.sql.legacy.allowCreatingManagedTableUsingNonemptyLocation真正的
另一個選擇是手動清理數據目錄中指定的錯誤消息。你可以這樣做dbutils.fs.rm。
% scala dbutils.fs。rm (“< path-to-directory >”,真的)