PySpark读取S3分区下gzip格式JSON文件提示找不到文件如何解决
可行解决方案
- 清理Hadoop S3A客户端层缓存
Spark默认使用Hadoop的S3A客户端访问S3,该客户端自带的元数据缓存优先级高于Spark表缓存,你之前的刷新操作没有触达这层缓存。执行以下配置后再重试读取:
# 临时禁用S3A客户端缓存 spark.conf.set("fs.s3a.metadata.cache.enabled", "false") spark.conf.set("fs.s3a.impl.disable.cache", "true") # 重试读取 spark.read.json('s3://my_bucket/my_prefix/2021/08/31/08/53/my_file.gz').show()
- 显式指定压缩格式
避免Spark自动识别压缩格式出错,读文件时主动指定gzip压缩参数:
spark.read.option("compression", "gzip")\ .json('s3://my_bucket/my_prefix/2021/08/31/08/53/my_file.gz').show()
- 校验EMR执行角色权限
boto3调用使用的是SageMaker的执行角色,而Spark作业使用的是EMR集群的EC2实例角色,两者权限可能不同。请确认EMR实例角色对目标文件拥有s3:GetObject权限,而非仅拥有路径枚举权限。 - 清空Spark全局缓存
清理Spark Catalog层的所有缓存后重试:
spark.catalog.clearCache() # 重新读取文件,不要复用之前创建的临时视图 spark.read.json('s3://my_bucket/my_prefix/2021/08/31/08/53/my_file.gz').show()
- 验证文件本身合法性
用boto3将目标文件下载到SageMaker本地,解压后校验是否为合法JSON格式,再尝试用Spark读取本地文件确认文件本身无损坏。
内容的提问来源于stack exchange,提问作者r_g_s_
相关产品推荐
相关产品推荐

