在我的工作中,最后一步是将执行的数据存储在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创建配置单元表和手动创建表有什么区别?为什么它在第一个场景中不起作用?有人能帮我吗?
1条答案
按热度按时间7hiiyaii1#
请用小写字母w!
不
它愚弄了我。如果你看的话,你的脚本有两种不同的用法。
我原来的回答似乎不赞成。