我尝试为hdfs中存在的文件编写相同的代码,但是当我使用相同的代码进行本地文件系统时,我收到错误。引起:java.io.FileNotFoundException:文件文件:/root/cd/parsed_cd_5.xml不存在
我正在使用 ElementTree 来解析XML文件。我在python中运行代码,它就像魅力一样。但是,当我尝试使用spark运行相同时,我会遇到错误。
错误:
文件" /root/sparkCD.py" ;,第82行,in 对于glob.glob中的文件名(os.path.join(path,' * .xml')):File" /usr/lib64/python2.6/posixpath.py" ;, line 67,在加入 elif path ==''或path.endswith(' /'):
从错误中可以清楚地看出问题是" 对于glob.glob中的文件名(os.path.join(路径,' * .xml'))&#34 ;.但我不知道如何在 pyspark 中实现同样的目标。 因为我不能分享我的代码,所以我只会分享我得到错误的片段,而我得到的错误与我没有收到错误的python代码有关。
Python:
path = '/root/cd'
for filename in glob.glob(os.path.join(path, '*.xml')):
tree = ET.parse(filename)
doc = tree.getroot()
Pyspark:
path = sc.textFile("file:///root/cd/")
for filename in glob.glob(os.path.join(path, '*.xml')):
tree = ET.parse(filename)
doc = tree.getroot()
我该如何解决这个问题。我想要的只是我目前使用pyspark在我的本地系统 cd 目录中处理的文件名。 如果这听起来很愚蠢,请原谅我。
更新
我尝试了下面给出的建议,但我没有得到文件名。 下面是我的代码:
filenme = sc.wholeTextFiles("file:///root/cd/")
nameoffile = filenme.map(lambda (name, text): name.split("/").takeRight(1)(0)).take(0)
print (nameoffile)
我得到的结果是
PythonRDD [22]在RDD的PythonRDD.scala:43
更新 我写了下面的代码而不是 wholeTextFiles ,但我得到了相同的错误。另外我想说,根据我的问题,我想得到我的文件的名称,所以textFile不会帮助我。我尝试运行你建议的代码,但我得到的结果相同。
path = sc.textFile("file:///root/cd/")
print (path)
答案 0 :(得分:1)
如果输入目录包含许多小文件,那么wholeTextFiles会有所帮助,请查看详细说明here。
>>pairRDD = sc.wholeTextFiles('<path>')
>>pairRDD.map(lambda x:x[0]).collect() #print all file names
pairRDD每条记录包含密钥作为绝对文件路径,值包含整个文件内容。
答案 1 :(得分:0)
不是完整的解决方案,但这似乎是您的代码的明显问题。
在python中你有:
path = '/root/cd'
现在路径应该包含您感兴趣的位置。
然而,在pySpark中,你这样做:
path = sc.textFile("file:///root/cd/")
现在路径包含文件中的文字您感兴趣的位置。
如果你尝试在那上面运行你的后续命令,那么它会尝试做一些奇怪的事情(因而失败)。