Spark无法再访问本地文件?代码运行报错路径匹配0个文件
解决Spark
wholeTextFiles 匹配不到文件的Py4JJavaError问题 这问题很明确——Spark在HDFS的目标路径下找不到你指定的dbs-*.json和uob-*.json文件,所以抛出了InvalidInputException。咱们一步步排查解决:
1. 先确认文件是否真的在HDFS对应路径里
首先得验证目标文件到底存不存在。你可以用HDFS命令行直接查看:
hdfs dfs -ls /user/jiewmeng/
要是不想切命令行,也可以在Spark代码里用文件系统API检查:
from pyspark.sql import SparkSession spark = SparkSession.builder.getOrCreate() fs = spark._jvm.org.apache.hadoop.fs.FileSystem.get(spark._jsc.hadoopConfiguration()) target_dir = spark._jvm.org.apache.hadoop.fs.Path("/user/jiewmeng/") if fs.exists(target_dir) and fs.isDirectory(target_dir): print("目录下的文件列表:") for file_status in fs.listStatus(target_dir): print(file_status.getPath()) else: print("指定的HDFS目录根本不存在!")
看看输出里有没有dbs-xxx.json和uob-xxx.json这类文件。
2. 排查通配符和路径写法
你代码里用的是相对路径./dbs-*.json,./uob-*.json,Spark会把它解析成HDFS的/user/jiewmeng/下的路径,但相对路径有时候容易出歧义,直接写绝对路径试试:
df = sc.wholeTextFiles('/user/jiewmeng/dbs-*.json,/user/jiewmeng/uob-*.json')\ .flatMap(lambda x: flattenTransactionFile(json.loads(x[1])))\ .toDF()
⚠️ 注意:通配符和路径之间不能有空格,多个模式用逗号分隔时也不能加空格,不然会被当成路径的一部分,肯定匹配不到。
3. 检查文件权限
就算文件存在,Spark运行的用户没有读权限也会触发这个错误。用HDFS命令看权限:
hdfs dfs -ls /user/jiewmeng/
输出里的权限列(比如-rw-r--r--)要确保当前用户有读权限。如果权限不够,执行:
hdfs dfs -chmod +r /user/jiewmeng/dbs-*.json hdfs dfs -chmod +r /user/jiewmeng/uob-*.json
4. 区分本地文件和HDFS文件
之前代码能跑,会不会是之前文件在本地系统,现在切换到HDFS环境了?如果文件在本地,要加file://前缀指定本地路径:
# 假设文件在本地当前目录下 df = sc.wholeTextFiles('file://./dbs-*.json,file://./uob-*.json')\ .flatMap(lambda x: flattenTransactionFile(json.loads(x[1])))\ .toDF()
不过从错误信息里的hdfs://localhost:9000/user/jiewmeng/来看,Spark现在默认读HDFS,优先确认HDFS里的文件情况。
5. 注意大小写问题
HDFS是区分大小写的!比如实际文件名是DBS-001.json,但你写的是dbs-*.json,或者后缀是.JSON大写,都会导致通配符匹配失败,这点别忽略。
内容的提问来源于stack exchange,提问作者Jiew Meng
相关产品推荐
相关产品推荐

