You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EMR环境下Glue Catalog注册Delta表后无法SQL查询的问题求助

问题解决:Glue Catalog查询Delta表报“Table does not support reads”

根因分析

你遇到的问题核心在于三点:

  1. SparkSession的Catalog配置冲突:你将默认spark_catalog设为DeltaCatalog,但实际使用的是Glue作为Hive兼容元数据存储,两者不匹配导致无法正确识别Glue中的Delta表元数据。
  2. Glue表元数据未标记Delta存储格式:通过saveAsTable写入时,Glue默认可能将表格式标记为Hive原生格式(如ORC),而非Delta,导致查询时无法识别。
  3. 写入代码的拼写错误:你使用了mode('overwrote'),正确参数应为mode('overwrite'),这可能导致写入逻辑异常。

具体修复步骤

1. 修正SparkSession初始化配置

将默认Catalog改回HiveCatalog(适配Glue Metastore),同时添加Delta自动识别配置:

spark = SparkSession.builder \
    .config('spark.jars', '/usr/share/aws/delta/lib/delta-core_2.12-2.4.0.jar') \
    .config('spark.sql.extension', 'io.delta.sql.DeltaSparkSessionExtension') \
    .config('spark.sql.catalog.spark_catalog', 'org.apache.spark.sql.hive.HiveCatalog') \
    .config('spark.sql.hive.convertMetastoreDelta', 'true') \
    .enableHiveSupport() \
    .getOrCreate()
  • spark.sql.hive.convertMetastoreDelta=true:让Spark自动识别Glue中标记为Delta的表,无需手动指定格式。

2. 正确写入Delta表到Glue Catalog

写入时指定全表名,修正mode参数:

# 先切换到目标数据库(可选,确保写入到mydb)
spark.sql("USE mydb")

# 写入Delta表
df.write.format('delta') \
    .mode('overwrite') \
    .saveAsTable('mydb.tbl')

3. 修复已存在的Glue表元数据

如果已经创建了表但无法查询,需要在Glue中为表添加Delta存储处理器参数:

方式1:AWS CLI命令

aws glue update-table \
    --database-name mydb \
    --table-input '{"Name": "tbl", "Parameters": {"storage_handler": "io.delta.hive.DeltaStorageHandler"}}'

方式2:Glue控制台操作

  1. 进入Glue控制台,找到mydb数据库下的tbl表。
  2. 点击“编辑表”,在“参数”部分添加键值对:storage_handler = io.delta.hive.DeltaStorageHandler。
  3. 保存修改。

验证

完成上述配置后,直接执行以下查询即可正常读取数据:

spark.sql('SELECT * FROM mydb.tbl')

内容的提问来源于stack exchange,提问作者Mark Zack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 08:15:05