【问题标题】:spark dataset overwrite particular partition not working in spark 2.4spark数据集覆盖特定分区在spark 2.4中不起作用
【发布时间】:2020-06-29 11:24:00
【问题描述】:

在我的工作中,最后一步是将执行的数据存储在 Hive 表中,并在“日期”列上进行分区。 有时,由于作业失败,我需要单独为特定分区重新运行作业。 正如观察到的,当我使用下面的代码时,spark 在使用覆盖模式时会覆盖所有分区。

ds.write.partitionBy("date").mode("overwrite").saveAsTable("test.someTable")

在浏览了多个博客和 stackoverflow 之后,我按照以下步骤仅覆盖特定分区。

Step 1: Enbable dynamic partition for overwrite mode
spark.conf.set("spark.sql.sources.partitionOverWriteMode", "dynamic")

Step 2: write dataframe to hive table using saveToTable

Seq(("Company1", "A"), 
("Company2","B"))
.toDF("company", "id")
.write
.mode(SaveMode.Overwrite)
.partitionBy("id")
.saveAsTable(targetTable)

spark.sql(s"SELECT * FROM ${targetTable}").show(false)
spark.sql(s"show partitions ${targetTable}").show(false)

Seq(("CompanyA3", "A"))
.toDF("company", "id")
.write
.mode(SaveMode.Overwrite)
.insertInto(targetTable)

spark.sql(s"SELECT * FROM ${targetTable}").show(false)
spark.sql(s"show partitions ${targetTable}").show(false)

仍然会覆盖所有分区。

根据这篇博客https://www.waitingforcode.com/apache-spark-sql/apache-spark-sql-hive-insertinto-command/read,“insertinto”应该只覆盖特定的分区

如果我先创建表然后使用“insertinto”方法,它工作正常

设置所需的配置, 第一步:创建表

第 2 步:使用 insertinto 方法添加数据

第 3 步:覆盖分区

我想知道,通过 SaveToTable 创建 hive 表和手动创建表有什么区别?为什么它在第一种情况下不起作用? 有人可以帮我吗?

【问题讨论】:

  • 工作了一段时间,需要调查,会回来的。
  • 前段时间我删除的答案很有趣。不知道该怎么做。
  • 如果您不介意,能否请您再次分享已删除的答案?
  • 我现在可以使用它了。我正在吃晚饭,你的代码有什么不同。事情变了。你是运行 gin Notebook 还是 spark shell 还是编译程序???
  • 知道了,只是误会了我们。

标签: scala apache-spark hive apache-spark-sql


【解决方案1】:

试试小写的 w!

spark.conf.set("spark.sql.sources.partitionOverwriteMode", "dynamic")

不是

spark.conf.set("spark.sql.sources.partitionOverWriteMode", "dynamic")

它骗了我。如果你看的话,你的脚本中有 2 个变体。

我的原始答案已弃用。

【讨论】:

  • 奇怪,文档建议对于 Hive 表,这始终是动态的:github.com/apache/spark/blob/…
  • @Raphael Roth。我测试了它。三重奏。
  • 很高兴知道...使用外部配置单元表,我从未使用过此选项并且效果很好(但使用 spark
  • @Raphael Roth。在过去,它有点不同,正如你所知,spark hive 有一些细微差别。我现在用 databricks 检查并用 spark shell 询问。像隔断这样神秘的火花保留了你为我回答的问题。
猜你喜欢
  • 1970-01-01
  • 2022-11-30
  • 2018-10-05
  • 2021-05-16
  • 1970-01-01
  • 2018-10-03
  • 2022-10-05
  • 1970-01-01
  • 2019-12-27
相关资源
最近更新 更多