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

ldfqzlk8  于 2021-07-13  发布在  Spark
关注(0)|答案(2)|浏览(430)

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

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

但是我想通过给分区列名和它的值来覆盖一个特定的分区 partitionBy(date='20-01-2021') ;
有没有办法覆盖一个特定的分区?

yrdbyhpb

yrdbyhpb1#

您可以指定要覆盖的分区的完整路径。在这种情况下,你不需要这样做 query.write.partitionBy("date") 你需要放弃 date 写之前列:

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

wqnecbli2#

尝试这种方法并适应您的具体情况:
需要在Hive或Spark里摆table。
该方法是动态的:

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)

相关问题