PySpark调用sc.pickleFile报absolute URI含相对路径错误如何解决
错误根因
该报错是传入sc.pickleFile()的路径不符合Spark的URI解析规则导致的:Spark读取文件时默认会将传入路径解析为标准绝对URI,若传入路径为相对路径、缺少对应存储的协议前缀、路径包含未转义的特殊字符,就会触发java.net.URISyntaxException异常。
你提到的保存目录下的part-00000、part-00001属于Spark输出的正常分片文件,本身没有问题,不需要单独指定读取分片文件。
报错详情
Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.collectAndServe. : java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: {filename}
解决方案
按优先级依次尝试以下操作即可解决:
- 传入带协议前缀的完整绝对路径
本地存储场景下路径前缀用file:///(注意是三个斜杠,第三个斜杠代表根目录),示例:
Windows本地路径写法示例:# 示例路径为本地的/data/pickle_save_dir,替换为你自己的目录绝对路径即可 rdd = sc.pickleFile("file:///data/pickle_save_dir")file:///C:/Users/xxx/Documents/pickle_save_dir
若文件存储在HDFS,路径前缀替换为HDFS集群地址即可,示例:hdfs://namenode:9000/user/xxx/pickle_save_dir - 检查并清理路径中的特殊字符
确认你传入的路径中没有未转义的空格、中文、{}、?、&等特殊字符,如有可先重命名目录删除特殊字符,或对路径做URL编码后再传入。 - 配置默认文件系统后使用相对路径
如果你需要使用相对路径读取,可先给Spark配置默认文件系统前缀,再传入相对路径即可,示例:# 配置默认文件系统为本地文件系统 sc._jsc.hadoopConfiguration().set("fs.defaultFS", "file:///") # 传入相对于当前工作目录的路径即可 rdd = sc.pickleFile("./pickle_save_dir")

内容的提问来源于stack exchange,提问作者Eunbin Park
相关产品推荐
相关产品推荐

