使用Spark SQL读取EMR上Delta Lake表报错:Table does not support reads
问题分析与解决方案
先排查表名拼写错误
你的代码中创建表的语句是:
CREATE TABLE poc.contacts USING DELTA LOCATION 's3://.../staging/contact'
但查询时使用的是poc.contact(少了末尾的s),这会导致Spark找不到正确的表。建议先修正表名拼写,执行:
select count(*) from poc.contacts
如果修正后仍报错,再排查以下问题:
1. 确认Spark配置是否正确生效
在Jupyter Notebook中,%%configure需要在SparkSession初始化之前执行才会生效。如果你的Notebook中先执行了import pyspark.sql或者隐式创建了SparkSession,后续的配置不会被应用。
解决方式:
- 重启Notebook内核,先执行
%%configure代码块,再进行后续Spark操作。 - 或者通过SparkSession显式加载配置:
from pyspark.sql import SparkSession from delta.tables import * spark = SparkSession.builder \ .appName("DeltaTest") \ .config("spark.jars.packages", "io.delta:delta-core_2.12:0.8.0") \ .config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension") \ .config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog") \ .getOrCreate()
2. 检查Delta版本与EMR Spark版本兼容性
Delta Lake版本需要和EMR上的Spark版本匹配,否则会出现兼容性问题:
- EMR 5.x(Spark 2.x)对应Delta Lake 0.4.x-0.7.x
- EMR 6.x(Spark 3.x)对应Delta Lake 1.x及以上
你当前使用的delta-core_2.12:0.8.0适用于Spark 3.0,但如果你的EMR集群是5.x版本(Spark 2.x),就会出现不兼容。请根据EMR版本调整Delta包版本,比如EMR 6.2.0(Spark 3.1.2)可使用io.delta:delta-core_2.12:1.0.0。
3. 使用Delta Lake原生方式注册表
尝试用DeltaTable API创建或注册表,确保元数据正确同步:
# 注册已存在的Delta表到Catalog deltaTable = DeltaTable.forPath(spark, "s3://.../staging/contact") deltaTable.createOrReplaceTempView("contacts") # 或者直接注册到poc数据库 spark.sql("CREATE OR REPLACE TABLE poc.contacts USING DELTA LOCATION 's3://.../staging/contact'")
4. 修复Delta表元数据(若S3上的表存在损坏)
如果S3上的Delta表元数据损坏,会导致无法读取,可执行修复命令:
deltaTable = DeltaTable.forPath(spark, "s3://.../staging/contact") deltaTable.vacuum() # 清理无效文件 deltaTable.generate("symlink_format_manifest") # 生成manifest文件辅助Spark读取
内容的提问来源于stack exchange,提问作者rodrigo sejas Jaldin
相关产品推荐
相关产品推荐

