通过AWS Glue Data Catalog写入Spark DataFrame到Hive表异常排查
Spark 2.4.0 on EMR + Glue Data Catalog: 写入数据成功但抛出空路径异常的原因与修复
异常含义解析
从堆栈信息的根源java.lang.IllegalArgumentException: Can not create a Path from an empty string可以看出,问题出在Glue Metastore尝试更新表统计信息的环节:
- 当你执行
saveAsTable或insertInto时,Spark会触发Hive Metastore的自动统计更新逻辑 - AWS Glue Data Catalog和原生Hive Metastore的实现不同,它没有本地的Warehouse目录,而Spark的Hive Shim层依然在尝试调用原生Hive的
Warehouse.getDatabasePath方法 - 如果
hive.metastore.warehouse.dir配置为空,这个方法就会因为无法创建空路径而抛出异常 - 数据写入逻辑和统计更新是分离的,所以数据能正常落到S3,但统计更新失败导致抛出异常
修复方案
这里有几个可行的解决办法,你可以根据自己的需求选择:
1. 配置有效的Hive Warehouse路径(推荐)
给Spark指定一个有效的S3路径作为hive.metastore.warehouse.dir,这个路径不需要提前创建,Glue会自动处理:
- 在Spark会话中临时设置:
spark.conf.set("hive.metastore.warehouse.dir", "s3://your-bucket-name/your-warehouse-path/") - 或者在EMR集群的
spark-defaults.conf中全局配置(需要重启集群或Spark服务):spark.hadoop.hive.metastore.warehouse.dir=s3://your-bucket-name/your-warehouse-path/
2. 禁用自动统计信息收集
如果你的业务不需要依赖Hive表的统计信息,可以直接关闭自动统计更新,避免触发这个报错逻辑:
- Spark会话临时配置:
spark.conf.set("hive.stats.autogather", "false") - 全局配置添加到
spark-defaults.conf:spark.hadoop.hive.stats.autogather=false
3. 检查Glue表的元数据配置
确认你的Glue表emrdb.testtableemr的Location字段已经正确设置为对应的S3路径,避免元数据缺失导致的路径问题:
- 登录AWS Glue控制台,找到该表,查看“存储位置”是否为有效的S3路径(比如
s3://your-bucket/testtableemr/)
验证方法
设置完上述任意一个配置后,重新运行你的写入代码:
val peopleTable = spark.sql("select * from emrdb.testtableemr") val filtered = peopleTable.filter("name = 'Andrzej'") filtered.repartition(1).write.format("hive").mode("append").saveAsTable("emrdb.testtableemr")
此时应该不会再抛出空路径的异常,同时数据依然能正常写入到S3的对应目录中。
内容的提问来源于stack exchange,提问作者awenclaw
相关产品推荐
相关产品推荐

