apache-spark - 从火花创建表时间歇性获取无法创建托管表错误
问题描述
从 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 不再允许在非空文件夹上创建管理表。
- 改变 sptk 行为背后的任何原因
- 对我们来说,尽管指定了“覆盖”选项 spark 无法清除现有数据并创建表,但对我们来说这似乎是一个重大变化
- 我们有解决这个问题的办法吗?
[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"
解决方案
推荐阅读
- r - 在R中给定条件之后从列'n'个字符中删除字符
- ruby - Ruby 正则表达式将 /abcdef/abcdef 替换为 /abcdef
- ssl - rtm_connect to slackbot 给出 SSL 证书验证错误
- jquery - 使用带有 jquery-validate 的 Fancybox - 确认框
- javascript - 我可以使用 d3.json 处理类似于 json 格式的字符串吗?
- docusignapi - 如何在使用 docusign 运行简单的邮件请求时解决“请求服务器时出错”
- node.js - 自动设置 KeystoneJS 上传文件 URL
- laravel - 如何在 curl 中为 -d 数据构建 Guzzle GET 请求
- python - Flask-Admin 使用 SQLAlchemy 上下文相关函数创建视图
- npm - UNMET 包依赖 babel - @babel\core\package.json 缺失