如何在spark-scala中覆盖特定的表分区



我有一个按日期分区的表,我试图覆盖一个特定的分区,但当我尝试下面的代码时,它会覆盖整个表

query.write.partitionBy("date").mode(SaveMode.Overwrite).format("orc").insertInto(mytableName)

但是我想通过给出分区列名及其值来覆盖特定的分区如CCD_ 1;

有什么方法可以覆盖特定的分区吗?

您可以指定要覆盖的分区的完整路径。在这种情况下,您不需要执行query.write.partitionBy("date"),并且在编写之前需要删除date

query.drop("date")
.write
.mode("overwrite")
.format("orc")
.save("/data/mytableName/date=20-01-2021")

尝试这种方法并适应您的具体情况:

需要在蜂箱或火花中设置桌子。

遵循这种动态方法:

spark.conf.set("spark.sql.sources.partitionOverwriteMode", "dynamic")
import org.apache.spark.sql.types._
val df = spark.range(9).map(x => (x, (x + 100) % 3)).toDF("c1", "c2")
df.repartition($"c2")
.write
.partitionBy("c2")
.mode("overwrite").saveAsTable("tabX")

更新分区-人为的,在设置后以这种方式

val df2 = spark.range(1).map(x => (x, (x + 100) % 3)).toDF("c1", "c2")
df2.repartition($"c2")
.write
.mode("overwrite").insertInto("tabX")

观察效果并根据具体情况进行调整。

// from 9 -> 7 entries, pls run
val df3 = spark.table("tabX")
df3.show(false)

相关内容

  • 没有找到相关文章

最新更新