spark数据集覆盖spark2.4中不工作的特定分区

gmxoilav  于 2021-06-25  发布在  Hive
关注(0)|答案(1)|浏览(439)

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

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

在浏览了多个blog和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”方法,就可以了
设置所需配置,

步骤1:创建表

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

步骤3:覆盖分区

我想知道,通过savetotable创建配置单元表和手动创建表有什么区别?为什么它在第一个场景中不起作用?有人能帮我吗?

7hiiyaii

7hiiyaii1#

请用小写字母w!

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

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

它愚弄了我。如果你看的话,你的脚本有两种不同的用法。
我原来的回答似乎不赞成。

相关问题