Spark SQL overwrite问题

本文解决了在SparkSQL中处理重复数据时遇到的Cannot overwrite a path that is also being read from错误,以及使用SaveMode.Overwrite时覆盖整个分区表而非特定分区的问题。通过创建临时表进行数据清洗,再全量覆盖结果表,避免了直接在源表上操作的限制。同时,介绍了如何精确地覆盖指定分区,而非整个表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

今天发现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 ")

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值