如何使用Spark执行插入覆盖?

时间:2017-10-01 21:52:08

标签: scala apache-spark apache-spark-sql spark-dataframe

我正在尝试将我们的ETL Hive脚本之一转换为Spark,其中Hive ETL脚本维护一个表,其中需要在新同步之前每晚删除部分数据。 Hive ETL使用主表删除使用insert overwrite超过3天的数据。基本上创建一个临时表,其数据不超过三天,然后覆盖主表。

使用Spark(使用Scala)我不断写入同一来源的错误。这是我的代码:

spark.sql ("Select * from mytbl_hive where dt > date_sub(current_date, 3)").registerTempTable("tmp_mytbl")

val mytbl = sqlContext.table("tmp_mytbl")
mytbl.write.mode("overwrite").saveTableAs("tmp_mytbl")

//writing back to Hive ...

mytbl.write.mode("overwrite").insertInto("mytbl_hive")

我收到的错误是我无法写入我正在阅读的表格。

有谁知道更好的方法吗?

1 个答案:

答案 0 :(得分:3)

你做不到。正如您所了解的,Spark明确禁止覆盖表,该表用作查询的源。虽然根据技术细节存在一些变通方法,但是不可靠,应该避免。

相反:

  • 将数据写入临时表。
  • 放下旧桌子。
  • 重命名临时表。
  

Hive ETL使用主表删除使用insert overwrite超过3天的数据。

最好按日期对数据进行分区,只需删除分区,甚至不用查看数据。