Spark 2.2读取含空格的ORC路径报错(Spark1.6正常),求解决方法
解决Spark 2.2中带空格和特殊字符的HDFS路径加载问题
这个问题我之前也碰到过,核心原因是Spark 2.x系列对HDFS路径的转义处理逻辑和1.6版本有差异,尤其是当路径里包含空格、冒号这类特殊字符时,转义层级的处理会直接影响路径解析结果。
问题分析
你提供的路径hdfs://hadoop/path/part_date=2018-04-20 15%3A01%3A21/000000_0里,空格和冒号的转义出现了重复处理的问题:
- 原始路径中的空格被转义成
%20,但你代码里写的路径是2018-04-20%2015%253A01%253A21——这里的%253A其实是%3A的二次转义(%25就是%的URL转义),Spark 2.x会严格按照URL规则解析,把%253A解析成%3A而非冒号,导致实际访问的路径和真实文件路径不匹配,自然报FileNotFoundException。 - Spark 1.6对这种二次转义的兼容性更好,会自动处理掉多余的转义层,所以能正常找到文件。
解决方案
这里给你三种可行的解决办法,按推荐程度排序:
1. 直接使用带原始空格的路径(最简便)
Spark 2.x的数据源加载逻辑会把路径直接交给Hadoop的FileSystem处理,而Hadoop是支持带空格的路径的,只要你用引号把路径包裹好,直接写原始空格和冒号就行:
df = spark.read.format('orc').load('hdfs://hadoop/path/part_date=2018-04-20 15:01:21/000000_0') df.show()
这种方式完全避免了转义错误,是最稳妥的选择。
2. 使用正确的单次转义路径
如果因为某些原因必须用转义后的路径,要确保只做一次URL转义:
- 空格转成
%20 - 冒号转成
%3A
不要对%再做转义(也就是不要写成%253A),正确的路径应该是:
df = spark.read.format('orc').load('hdfs://hadoop/path/part_date=2018-04-20%2015%3A01%3A21/000000_0') df.show()
3. 借助Hadoop Path对象构建路径(最严谨)
如果你经常处理带特殊字符的HDFS路径,可以用Hadoop的Path类来构建路径,它会自动处理所有特殊字符的转义:
from pyspark.sql import SparkSession from org.apache.hadoop.fs import Path spark = SparkSession.builder.appName("LoadORC").getOrCreate() # 直接写原始路径,Path类会自动处理转义 hdfs_path = Path('hdfs://hadoop/path/part_date=2018-04-20 15:01:21/000000_0') df = spark.read.format('orc').load(str(hdfs_path)) df.show()
这种方式适合复杂路径场景,能彻底避免手动转义的错误。
验证建议
你可以先试试第一种方法,直接用带空格的路径,一般就能解决问题。如果还是不行,可以用hdfs dfs -ls命令测试路径是否能被Hadoop正确识别,比如:
hdfs dfs -ls 'hdfs://hadoop/path/part_date=2018-04-20 15:01:21/'
如果这个命令能列出文件,说明路径本身没问题,就是Spark代码里的转义处理错了。
内容的提问来源于stack exchange,提问作者Tronald Dump
相关产品推荐
相关产品推荐

