Spark SQL overwrite问题

背景

今天发现hive中有张表,每天会有定时插入操作,但是会有比较多的重复数据,于是想着每天再插入的时候清理一下,用的Spark SQL。

问题

在试用的时候,出现了两个问题:

1.Cannot overwrite a path that is also being read from

2.SaveMode.Overwrite 将分区表整张表覆盖

解决

第一个问题

发生的原因是,我先select再overwrite同一张。很明显在spark sql中是不可以的,无论是saveAsTable 还是 spark.sql("insert overwrite table .....") ,都行不通,报了这个错。但是在hive和beeline中却是可以通过insert overwrite table ..... 这种方式,来覆盖。

所以,我只能先将select出来的结果保存在临时表中,在全量覆盖结果表。

//将结果保存在临时表中    
spark.sql("select ....").write.mode(SaveMode.Overwrite).saveAsTable("tmp_tab")
//将临时表覆盖结果表
spark.table("tmp_tab").write.mode(SaveMode.Overwrite).saveAsTable("result_tab")

第二个问题

使用SaveMode.Overwrite会覆盖整个分区表,而不是预想的覆盖某个分区的数据。

这个时候,就可以用spark.sql("insert overwrite table xxx partition(aaa,bbb) select ...") 来解决


df.createOrReplaceTempView("temp_table_1")
spark.sql("insert overwrite table target_table partition(year,day) select name,age,sex,created_ts,updated_ts,year,day from temp_table_1 ")

 

你可能感兴趣的:(spark)