首页 > 解决方案 > 从火花创建表时间歇性获取无法创建托管表错误

问题描述

从 spark 保存托管表时,我们间歇性地在 spark 2.4 中遇到以下错误。

错误 - pyspark.sql.utils.AnalysisException:u“无法创建托管表('hive_issue.table')。关联位置('s3://{bucket_name}/EMRFS_WARE_TEST167_new/warehouse/hive_issue.db/table')已经存在。;”

重现步骤-- 1. 从 spark 中型数据(30MB CSV 文件)创建数据框 2. 将数据框保存为表格 3. 在上述操作进行时终止会话

注意—— 会话终止状态只是重现此问题的一种方式。当我们多次运行相同的火花作业时,我们会间歇性地实时面临这个问题。我们使用 EMR 集群中的 EMRFS 和 HDFS,我们在两个系统上都面临同样的问题。我们可以解决此问题的唯一方法是删除表将保留其文件的目标文件夹,这对我们来说不是选项,我们需要将历史信息保留在表中,因此我们在写入表时使用 APPEND 模式。

我们浏览了 spark 2.4 [1] 的文档,发现 spark 不再允许在非空文件夹上创建管理表。

  1. 改变 sptk 行为背后的任何原因
  2. 对我们来说,尽管指定了“覆盖”选项 spark 无法清除现有数据并创建表,但对我们来说这似乎是一个重大变化
  3. 我们有解决这个问题的办法吗?

[1] 从 Spark 2.4 开始,不允许创建具有非空位置的托管表。尝试创建具有非空位置的托管表时会引发异常。将 true 设置为 spark.sql.legacy.allowCreatingManagedTableUsingNonemptyLocation 会恢复以前的行为。此选项将在 Spark 3.0 中删除。

谢谢, 阿比吉特

from pyspark.sql import SparkSession
sc = SparkSession.builder.enableHiveSupport().getOrCreate()
df = sc.read.csv("s3://{sample-bucket}1/DATA/consumecomplians.csv")
print "STARTED WRITING TO TABLE"
# Terminate session using ctrl + c after this statement post df.write action started
df.write.mode("append").saveAsTable("hive_issue.table")
print "COMPLETED WRITING TO TABLE"

标签: apache-sparkpysparkapache-spark-sql

解决方案


推荐阅读