【问题标题】:Save Mode when writing Parquet files and saving as partitioned table写入 Parquet 文件并保存为分区表时的保存模式
【发布时间】:2020-03-21 17:18:20
【问题描述】:

当我将数据框写入现有位置而不指定保存模式时,它会返回错误

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 方法添加到第一个 sn-p 中。

【问题讨论】:

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


    【解决方案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

    【讨论】:

    • 谢谢,我错过了保存方法。感谢您指出这一点。
    【解决方案2】:

    正如 Aranvid 正确指出的那样,Save 方法和 SaveAsTable 进行不同的检查。

    DataFrameWriter 的 SaveAsTable 仅检查 Hive 目录中是否存在该表并抛出 new AnalysisException(s"Table $tableIdent already exists.")。另一方面,Save 表检查路径是否存在。更具体地说,它使用类org.apache.spark.sql.execution.datasources.InsertIntoHadoopFsRelationCommand 的run 方法,如果路径存在且未指定SaveMode,则触发AnalysisException

    我不知道为什么 Spark 开发人员会做出这样的区分,我的猜测是,在一种情况下,您在 Hive 级别上运行,因此您在文件系统级别上“信任”另一种情况下的 Hive 目录,因此您“信任”文件系统(如果路径存在则抛出错误)。

    【讨论】:

    • 谢谢两位。我编辑了我最初的帖子。我还应该提到我正在研究 Azure Databricks。那么我们可以得出结论,默认情况下 save() 会返回错误,而 saveAsTable() 会覆盖?另外,前者确实检查文件位置,而后者仅检查表名?
    • SaveAsTable() 也不会覆盖,除非明确提及 saveMode。正如 LizardKing 所说,它会抛出 AnalysisException。
    • 老兄,这就是我的结论。在 Databricks 上工作不会改变任何事情。播放器是一样的,它仍然使用 Spark,一个分布式文件系统和一个内部(或外部)Hive Metastore。我对 Databricks 进行了一些检查,发现了与您注意到的相同的行为。
    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多