编写Parquet文件并将其另存为分区表时的保存模式

时间:2019-11-26 10:06:45

标签: scala dataframe apache-spark parquet azure-databricks

当我在不指定保存模式的情况下将数据帧写入现有位置时,它将返回错误

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方法。

2 个答案:

答案 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”目录“信任”到另一个,因此您“信任”了文件系统(如果路径存在,则抛出错误)。