問題
當您試圖通過取消當前正在運行的作業來重新運行Apache Spark寫操作時,出現以下錯誤:
錯誤:org.apache.spark.sql.AnalysisException:不能創建托管表(' ' testdb ' .sql ')。testtable”)。關聯的位置('dbfs:/user/hive/warehouse/testdb.db/metastore_cache_ testtable)已經存在;
導致
此問題是由於Spark在2.4版中的默認行為發生了變化。
以下情況會出現此問題:
- 集群正在執行寫操作時終止。
- 臨時網絡問題。
- 工作中斷。
一旦特定表的metastore數據損壞,就很難恢複,除非手動刪除該位置的文件。基本上,問題是元數據目錄稱為的地方當Databricks試圖覆蓋它時,它不會自動刪除。
您可以通過以下步驟重現該問題:
- 創建一個數據幀:
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 >”,真的)