繁体   English   中英

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

[英]How can you perform a Insert overwrite using Spark?

我正在尝试将我们的ETL Hive脚本之一转换为Spark,其中Hive ETL脚本维护着一个表,该表中的部分数据需要在每晚进行新同步之前删除。 Hive ETL使主表使用插入覆盖删除超过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")

我收到无法写入正在读取的表的错误。

有人知道这样做的更好方法吗?

你不能。 如您所知,Spark明确禁止覆盖表,该表用作查询的源。 尽管存在一些变通办法,具体取决于技术性,但仍不可靠,应避免使用。

代替:

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

Hive ETL使主表使用插入覆盖删除超过3天的数据。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM