gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:46:36 25 4
gpt4 key购买 nike

我正在尝试将我们的 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 明确禁止覆盖用作查询源的表。虽然根据技术细节存在一些解决方法,但这些方法并不可靠,应该避免。

相反:

  • 将数据写入临时表。
  • 删除旧表。
  • 重命名临时表。

The Hive ETL takes the main table deletes data that in greater than 3 days using insert overwrite.

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

关于scala - 如何使用 Spark 执行插入覆盖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46517244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com