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 ")

 

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
当谈到Spark SQL编程的初级实践时,以下是一些常见的任务和技巧: 1. 创建SparkSession:使用Spark SQL之前,你需要创建一个SparkSession对象。可以使用以下代码创建一个SparkSession: ```scala import org.apache.spark.sql.SparkSession val spark = SparkSession.builder() .appName("Spark SQL Example") .getOrCreate() ``` 2. 加载数据:使用Spark SQL可以加载各种数据源,如CSV、JSON、Parquet等。以下是一个加载CSV文件的示例: ```scala val data = spark.read .format("csv") .option("header", "true") .load("path/to/data.csv") ``` 3. 创建临时表:你可以将数据注册为临时表,以便使用SQL查询操作。以下是一个示例: ```scala data.createOrReplaceTempView("my_table") ``` 4. 执行SQL查询:一旦你有了临时表,就可以使用SQL语句进行查询操作。以下是一个示例: ```scala val result = spark.sql("SELECT * FROM my_table WHERE column_name = 'value'") result.show() ``` 5. DataFrame操作:Spark SQL的核心是DataFrame API,它提供了丰富的操作方法。以下是一些常见的DataFrame操作示例: ```scala // 选择特定的列 data.select("column1", "column2") // 过滤数据 data.filter($"column" > 10) // 分组和聚合 data.groupBy("column").agg(sum("value")) // 排序 data.orderBy($"column".desc) // 添加新列 data.withColumn("new_column", $"column1" + $"column2") ``` 6. 写入数据:除了读取数据,你还可以使用Spark SQL将数据写入不同的格式。以下是一个示例: ```scala data.write .format("parquet") .mode("overwrite") .save("path/to/output") ``` 这些是Spark SQL编程的一些初级实践。希望能帮助你入门!如果有更具体的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值