apache-spark - 写入 Delta 表时检测到架构不匹配
问题描述
我收到:
写入 Delta 表时检测到架构不匹配
我尝试遵循以下建议:
要覆盖您的架构或更改分区,请设置:'.option("overwriteSchema", "true")'。
基于此解决方案:写入 Delta 表时检测到架构不匹配 - Azure Databricks
- 我添加了这样一个选项,但它看起来不起作用,或者我只是做得不正确。
- 我搞定了
dbfs:/delta-tables/_delta_log/
- 我什至试图删除我保存数据的整个文件夹(
dbfs:/FileStore/shared_upload/[user]/data_Delta
)。
这些都没有解决问题。我做错了什么?如果我想用一个新的集群重用一个旧的笔记本,为什么它会以这种方式运行,我终止的旧的,所以我猜它应该是“干净的”?
我按照以下方式进行:
1.我从GEN2加载数据。它们以这种方式采用镶木地板格式:
spark.read.option("overwriteSchema", "true")\
.parquet(f"wasbs://{CONTAINER_NAME}@{STORAGE_ACCOUNT_NAME}.blob.core.windows.net/data")
如您所见,我设置overwriteSchema
为true
.
2.然后我以增量格式保存它:
sd_weather.write.format('delta').mode("overwrite") \
.save("dbfs:/FileStore/shared_upload/[user]/data_Delta")
3.然后我尝试创建增量表
sd_weather.write.format('delta') \
.mode("overwrite").saveAsTable("data_Delta")
在这里我收到错误:
AnalysisException:写入 Delta 表时检测到架构不匹配
解决方案
您需要.option("overwriteSchema", "true")
在写入操作中使用,而不是在读取操作中使用:
sd_weather.write.format('delta').mode("overwrite") \
.option("overwriteSchema", "true") \
.save("dbfs:/FileStore/shared_upload/[user]/data_Delta")
您还将数据写入两次,一次作为“普通”目录,第二次 - 作为托管表。如果您想在自定义位置创建非托管表,只需将path
选项添加到第 3 个变体(也是dbfs:/
默认模式,因此您可以省略它):
sd_weather.write.format('delta') \
.option("overwriteSchema", "true") \
.option("path", "/FileStore/shared_upload/[user]/data_Delta") \
.mode("overwrite").saveAsTable("data_Delta")
此外,这取决于架构的不同之处,如果它只是添加列或类似的东西,那么您可以使用mergeSchema
而不是overwriteSchema
.
推荐阅读
- python - 在时间戳边界之间填充 Pandas 列
- react-native - React Native(Android):找不到屏幕“Home”的“component”、“getComponent”或“children”道具
- javascript - 我不断收到关于 discord.js 中 .position 的错误
- cassandra - com.datastax.oss -> java-driver-core 和 com.datastax.cassandra -> cassandra-driver-core 之间的 Cassandra 区别
- beautifulsoup - BeautifulSoup - 餐桌
- java - GraphStream 2.0 - 拖动节点时鼠标指针偏移
- python - 仅从 df 中提取值
- perl - Perl script doesn't see modules .pm
- python-3.x - 请求不在 Python3 中发送
- python - 存储在熊猫数据框中时不显示 Python Unicode 表情符号