在覆蓋模式下創建表失敗時中斷

學習如何排除故障發生時重新運行Apache火花寫操作被取消當前運行的工作。

寫的亞當Pavlacka

去年發表在:2022年5月10日

問題

當你嚐試重新運行Apache火花寫操作被取消當前運行工作,出現以下錯誤:

錯誤:org.apache.spark.sql。AnalysisException:無法創建管理表(“testdb”。testtable”)。相關的位置(“dbfs: / user /蜂巢/倉庫/ testdb。db / metastore_cache_ testtable)已經存在。;

導致

這個問題是由於改變默認行為引發的2.4版。

這個問題會發生如果:

  • 集群的終止而正在進行寫操作。
  • 一個臨時發生網絡問題。
  • 這項工作被打斷了。

一旦metastore數據為一個特定的表損壞,很難恢複除了手動刪除文件的位置。基本上,問題在於一個元數據目錄的地方不會自動刪除當磚試圖覆蓋它。

你可以複製這個問題通過以下步驟:

  1. 創建一個DataFrame:
    val df = spark.range (1000)
  2. 寫DataFrame位置在覆蓋模式下:
    df.write.mode (SaveMode.Overwrite) .saveAsTable (“testdb.testtable”)
  3. 取消命令時執行。
  4. 重新運行命令。

解決方案

設置標誌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 >”,真的)


這篇文章有用嗎?