Spark SQL-Hive“无法覆盖表”解决方法

时间:2020-08-25 14:30:06

标签: apache-spark hadoop pyspark hive apache-spark-sql

我正在使用PySpark和Hive开发Spark集群。

我在SO上看到了很多有关“无法覆盖正在读取的表” Hive错误的问题。我了解到这来自Hive本身的工作方式,我们正计划为此迁移到Kudu:但是现在我需要在Hive上完成工作。 我找到了一些解决方案,几乎都依靠“打破数据沿袭”原理:

  • 保存在临时表上,回读然后保存在正确的表上
  • 检查数据框

和类似的。我不想使用它们主要是因为它们在大型数据集上效率不高,所以我想到了这一点:

macCatalyst 13.4

基本上,我只是

  • 将更新后的表写入临时表
  • 删除原始表格
  • 重新命名临时表以匹配原始名称

使用这种方法,我只需写入一次数据,而drop-rename部分相当有效(3K记录表大约需要1秒)。 既然我知道我在编码方面并不那么出色...谁能找出这可能出什么问题吗?这似乎是一个简单的解决方法,但是我在Internet上找不到任何类似的东西(这使我非常怀疑)。

谢谢!

1 个答案:

答案 0 :(得分:0)

您为什么不使用插入覆盖?尽管您的方法可行,但它不如使用Hive声明的方法健壮。另外,这将减少表文件在您的blob存储区(如s3)中存储的位置偏移。

Standard syntax:
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] select_statement1 FROM from_statement;

Hive文档:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML

另一个不错的选择是仅使用delta而不是hive,如果您在数据块环境中工作,这将非常有用。这样做的原因是它允许通过upsert更快地插入。在此处查看更多信息:https://databricks.com/blog/2019/03/19/efficient-upserts-into-data-lakes-databricks-delta.html

相关问题