Glue Notebook中SparkDataFrames无法读取Glue Catalog的Iceberg表
Glue Notebook读取Iceberg表报错InputFormat为null的解决办法
问题根源
你的Iceberg表在Glue Catalog里的元数据缺了Spark/Iceberg需要的InputFormat和OutputFormat配置项。Athena能正常查询是因为它直接用Iceberg的元数据解析逻辑,但Glue Notebook的Spark环境依赖Hive兼容的元数据格式,缺这俩配置就会触发报错。
具体解决步骤
1. 补全Glue表的元数据配置
先通过Glue控制台或AWS CLI查看目标表的元数据,确认StorageDescriptor下的InputFormat和OutputFormat是否为空。如果为空,手动添加Iceberg对应的配置:
InputFormat:org.apache.iceberg.hadoop.hive.HiveIcebergInputFormatOutputFormat:org.apache.iceberg.hadoop.hive.HiveIcebergOutputFormat- 同时把
SerdeInfo下的SerializationLibrary设为org.apache.iceberg.hadoop.hive.HiveIcebergSerDe
用AWS CLI修改的命令示例:
aws glue update-table --database-name mydatabase --table-input '{ "Name": "my_table", "StorageDescriptor": { "InputFormat": "org.apache.iceberg.hadoop.hive.HiveIcebergInputFormat", "OutputFormat": "org.apache.iceberg.hadoop.hive.HiveIcebergOutputFormat", "SerdeInfo": { "SerializationLibrary": "org.apache.iceberg.hadoop.hive.HiveIcebergSerDe" } } }'
2. 修正Glue Notebook的Spark会话配置
确保Spark初始化时正确配置Iceberg的Glue Catalog,把以下配置加到初始化脚本中:
from pyspark.sql import SparkSession spark = SparkSession.builder \ .config("spark.sql.catalog.glue_catalog", "org.apache.iceberg.spark.SparkCatalog") \ .config("spark.sql.catalog.glue_catalog.catalog-impl", "org.apache.iceberg.aws.glue.GlueCatalog") \ .config("spark.sql.catalog.glue_catalog.warehouse", "s3://你的Iceberg仓库路径/") \ .config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \ .config("spark.hadoop.hive.metastore.client.factory.class", "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory") \ .getOrCreate()
3. 验证表读取是否正常
修复元数据和配置后,重新在Notebook中尝试读取表:
# 方式1:通过Glue Catalog引用 df = spark.sql("SELECT * FROM glue_catalog.mydatabase.my_table") df.show() # 方式2:直接读取S3路径(备用方案) df = spark.read.format("iceberg").load("s3://你的表存储路径/") df.show()
4. 排查表创建环节的问题
如果是通过魔法命令创建表后出现的问题,要确保建表时指定了正确的Catalog和存储格式。比如用%sql魔法命令时,需明确使用Iceberg Catalog:
CREATE TABLE glue_catalog.mydatabase.my_table ( id INT, name STRING ) USING iceberg LOCATION 's3://你的Iceberg仓库路径/mydatabase/my_table'
关键注意事项
- 优先使用AWS Glue 3.0+版本,内置Iceberg支持,兼容性更强
- 确认Glue执行角色拥有对应S3路径的读写权限,避免权限问题干扰
- 会话配置中不要同时混用Hive Catalog和Iceberg Catalog的设置,保持配置统一
内容的提问来源于stack exchange,提问作者Aleksei Díaz
相关产品推荐
相关产品推荐

