EMR环境下Glue Catalog注册Delta表后无法SQL查询的问题求助
问题解决:Glue Catalog查询Delta表报“Table does not support reads”
根因分析
你遇到的问题核心在于三点:
- SparkSession的Catalog配置冲突:你将默认
spark_catalog设为DeltaCatalog,但实际使用的是Glue作为Hive兼容元数据存储,两者不匹配导致无法正确识别Glue中的Delta表元数据。 - Glue表元数据未标记Delta存储格式:通过
saveAsTable写入时,Glue默认可能将表格式标记为Hive原生格式(如ORC),而非Delta,导致查询时无法识别。 - 写入代码的拼写错误:你使用了
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控制台操作
- 进入Glue控制台,找到
mydb数据库下的tbl表。 - 点击“编辑表”,在“参数”部分添加键值对:
storage_handler = io.delta.hive.DeltaStorageHandler。 - 保存修改。
验证
完成上述配置后,直接执行以下查询即可正常读取数据:
spark.sql('SELECT * FROM mydb.tbl')
内容的提问来源于stack exchange,提问作者Mark Zack
相关产品推荐
相关产品推荐

