Python 使用pyspark从本地系统读取文件时获取文件名 其他更新:
我尝试为hdfs中存在的文件编写相同的代码,但当我为本地文件系统使用相同的代码时,我遇到了错误。原因:java.io.FileNotFoundException:File File:/root/cd/parsed_cd_5.xml不存在Python 使用pyspark从本地系统读取文件时获取文件名 其他更新:,python,xml,hadoop,apache-spark,pyspark,Python,Xml,Hadoop,Apache Spark,Pyspark,我尝试为hdfs中存在的文件编写相同的代码,但当我为本地文件系统使用相同的代码时,我遇到了错误。原因:java.io.FileNotFoundException:File File:/root/cd/parsed_cd_5.xml不存在 原始问题和初始更新 我正在使用ElementTree解析XML文件。我用python运行了代码,它工作得很好。但是,当我试图使用spark运行相同的程序时,我的错误率就降低了 错误: path = sc.textFile("file:///root/cd/")
原始问题和初始更新 我正在使用ElementTree解析XML文件。我用python运行了代码,它工作得很好。但是,当我试图使用spark运行相同的程序时,我的错误率就降低了 错误:
path = sc.textFile("file:///root/cd/")
for filename in glob.glob(os.path.join(path, '*.xml')):
tree = ET.parse(filename)
doc = tree.getroot()
文件“/root/sparkCD.py”,第82行,在
对于glob.glob(os.path.join(path,*.xml'))中的文件名:join中的第67行文件“/usr/lib64/python2.6/posixpath.py”
elif path==''或path.endswith('/'):
从错误中可以清楚地看出,问题在于“对于glob.glob(os.path.join(path,*.xml'))中的文件名,”。但我不知道如何在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目录中。
如果你觉得这很愚蠢,请原谅我
更新:
path = sc.textFile("file:///root/cd/")
for filename in glob.glob(os.path.join(path, '*.xml')):
tree = ET.parse(filename)
doc = tree.getroot()
我尝试了下面给出的建议,但我没有得到文件名。
下面是我的代码:
filenme = sc.wholeTextFiles("file:///root/cd/")
nameoffile = filenme.map(lambda (name, text): name.split("/").takeRight(1)(0)).take(0)
print (nameoffile)
我得到的结果是
PythonRDD[22]在PythonRDD.scala的RDD处:43
更新:
我写了下面的代码,而不是wholeTextFiles,但我得到了同样的错误。另外,我想说,根据我的问题,我想得到我的文件名,所以textFile不会帮助我。我试着运行你建议的代码,但得到了相同的结果
path = sc.textFile("file:///root/cd/")
print (path)
若输入目录包含许多小文件,那个么wholeTextFiles会有所帮助,请查看详细说明
>pairRDD=sc.wholeTextFiles(“”)
>>pairdd.map(lambda x:x[0]).collect()#打印所有文件名
pairRDD每个记录都包含作为绝对文件路径的键和作为整个文件内容的值。这不是一个完整的解决方案,但您的代码显然存在问题 在python中,您有:
path = '/root/cd'
现在路径应该包含您感兴趣的位置
但是,在pySpark中,您可以执行以下操作:
path = sc.textFile("file:///root/cd/")
现在路径包含文件中您感兴趣的位置处的文本
如果您尝试对其运行followup命令,它尝试执行一些奇怪的操作(因此失败)是有道理的。如果我正确理解了您的问题,则
sc.wholeTextFiles(“”)
将有所帮助。它返回pairRDD,其中key为绝对文件路径,value为字符串形式的整个文件内容。PythonRDD处的RDD处的PythonRDD[22]在PythonRDD处。当您尝试打印RDD时,需要scala:43
。使用rdd.collect或foreach打印rdd内容我有一个大小接近7GB的目录,但其中的单个文件大小为500KB到1Mb,我可以在那里使用wholeTextFiles
吗?如何使用wholeTextFiles
提取文件名?您能提供一些示例吗?我已经更新了答案,我强烈建议您在spark wiki上使用RDD转换和聚合功能。我尝试为hdfs中的文件编写相同的代码,但在本地文件系统中使用相同的代码时,出现了错误原因:java.io.FileNotFoundException:File File:/root/cd/parsed_cd_5.xml不存在
@Ironman您只能使用特定于python的api而不是spark python api在本地读取文件。我尝试了您的方法,但仍然得到相同的结果。@Ironman请更新您的问题,以准确显示您尝试了什么。(具体来说,您的python和pyspark代码之间有什么区别吗?您是否尝试过只运行python代码?)。我已经更新了我的问题。请检查我想要我提到的文件名。你能给我举个合适的例子吗。我试着为hdfs中的文件编写相同的代码,但当我为本地文件系统使用相同的代码时,我会出错。原因:java.io.FileNotFoundException:File File:/root/cd/parsed\u cd\u 5.xml不存在。您能提出一些建议吗?我如何迭代在wholeTextFiles
中获取的文件名。我想获取当前文件路径。请帮忙。