在Databricks SQL Engine查询AWS Glue Catalog中Delta表失败求助
解决Databricks SQL查询Glue Catalog中Delta表失败的问题
问题根源
AWS Glue爬虫默认将带有_symlink_format_manifest的Delta表识别为Parquet表,生成的元数据采用Hive兼容的输入输出格式、Parquet SerDe,且表分类标记为parquet。但Databricks会检测到Delta表根目录下的_delta_log事务日志,强制要求使用Delta格式读取,两者冲突导致报错。
解决方案
1. 修正Glue表元数据(核心解决)
直接修改Glue Catalog中目标表的元数据,让Databricks正确识别为Delta表:
- 控制台操作:
- 登录AWS Glue控制台,找到对应数据库和表
- 进入表编辑页面,修改以下配置:
- 将
存储位置改为Delta表根路径:s3://COMPANY/club/attachment(移除末尾的/_symlink_format_manifest) - 更新
输入格式为io.delta.hive.DeltaInputFormat - 更新
输出格式为io.delta.hive.DeltaOutputFormat - 更新
序列化库为io.delta.hive.DeltaSerDe - 将
分类参数改为delta - 添加表级参数
delta.table=true
- 将
- CLI批量操作:
aws glue update-table \ --database-name 你的数据库名 \ --table-input '{ "Name": "attachment", "StorageDescriptor": { "cols": [ {"name": "id", "type": "string"}, {"name": "media", "type": "string"}, {"name": "media_type", "type": "string"}, {"name": "title", "type": "string"}, {"name": "type", "type": "smallint"}, {"name": "clubmessage_id", "type": "string"} ], "location": "s3://COMPANY/club/attachment", "inputFormat": "io.delta.hive.DeltaInputFormat", "outputFormat": "io.delta.hive.DeltaOutputFormat", "SerDeInfo": { "serializationLib": "io.delta.hive.DeltaSerDe" }, "parameters": { "UPDATED_BY_CRAWLER": "CRAWLER_NAME", "classification": "delta" } }, "parameters": { "UPDATED_BY_CRAWLER": "CRAWLER_NAME", "classification": "delta", "delta.table": "true" } }'
2. 调整Glue爬虫配置(避免重复问题)
修改爬虫设置,防止后续同步时再次误识别:
- 在爬虫的分类配置中,添加
delta作为优先分类,确保爬虫优先识别Delta格式 - 或在爬虫的排除路径中添加
/_symlink_format_manifest/**,避免爬虫读取manifest文件而误判为Parquet表
3. 临时应急方案(不推荐长期使用)
若无法立即修改元数据,可在Databricks SQL Warehouse中执行以下命令禁用格式检查:
SET spark.databricks.delta.formatCheck.enabled=false;
⚠️ 注意:此方法会跳过Delta格式一致性校验,可能导致数据读取异常,仅作为临时应急手段。
验证
完成配置修改后,在Databricks SQL中重新执行查询,确认报错消失,数据正常返回。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

