You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:28:31