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

了解如何通過取消當前運行的作業重新運行Apache Spark寫操作時發生的故障排除。

寫的亞當Pavlacka

最後發布日期:2022年5月10日

問題

當您試圖通過取消當前正在運行的作業來重新運行Apache Spark寫操作時,出現以下錯誤:

錯誤:org.apache.spark.sql.AnalysisException:不能創建托管表(' ' testdb ' .sql ')。testtable”)。關聯的位置('dbfs:/user/hive/warehouse/testdb.db/metastore_cache_ testtable)已經存在;

導致

此問題是由於Spark在2.4版中的默認行為發生了變化。

以下情況會出現此問題:

  • 集群正在執行寫操作時終止。
  • 臨時網絡問題。
  • 工作中斷。

一旦特定表的metastore數據損壞,就很難恢複,除非手動刪除該位置的文件。基本上,問題是元數據目錄稱為的地方當Databricks試圖覆蓋它時,它不會自動刪除。

您可以通過以下步驟重現該問題:

  1. 創建一個數據幀:
    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 >”,真的)


這篇文章有用嗎?