当我在不指定保存模式的情况下将数据帧写入现有位置时,它将返回错误
df.write.partitionBy("column").option("path", <EXISTING PATH>).format("parquet").save
但是,当我仅使用saveAsTable选项执行相同的命令时,如果该表不存在,Spark似乎会覆盖数据。
df.write.partitionBy("column").option("path", <EXISTING PATH>).format("parquet").saveAsTable(<NEW_TABLE>)
谁能提供对此逻辑的解释。到底发生了什么?
我正在研究Databricks。
编辑
在Aravind的评论之后,我在第一个代码段中添加了缺少的save
方法。
答案 0 :(得分:1)
下面的代码将返回一个dataFrameWriter,而不是写入指定的路径。
df.write.partitionBy("column").option("path", <EXISTING PATH>).format("parquet")
要使用save()函数按分区将数据帧写入指定路径,请考虑以下代码,
df.write.partitionBy("column").format("parquet").save("<EXISTING PATH>/df.parquet")
要使用saveAsTable()函数按分区将数据帧写入指定路径,请考虑您的代码,
df.write.partitionBy("column").option("path", <EXISTING PATH>).format("parquet").saveAsTable(<NEW_TABLE>)
回到您的问题,将其设为save()函数或saveAsTable()函数,默认的saveMode将为 errorIfExists 。
有关save()或saveAsTable()或saveMode的更多信息,请访问DataFrameWriter。
答案 1 :(得分:1)
正如Aranvid正确指出的,Save方法和SaveAsTable做不同的检查。
DataFrameWriter的SaveAsTable仅检查Hive目录中表的存在并抛出new AnalysisException(s"Table $tableIdent already exists.")
。另一方面,保存表仅检查路径是否存在。更具体地说,它使用类org.apache.spark.sql.execution.datasources.InsertIntoHadoopFsRelationCommand
的run方法在路径存在且未指定SaveMode时触发AnalysisException
。
我不知道为什么Spark开发人员会做出这样的区分,我猜是在一种情况下,您在Hive级别上运行,因此您在文件系统级别上将“ Hive”目录“信任”到另一个,因此您“信任”了文件系统(如果路径存在,则抛出错误)。