Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用pyspark从本地系统读取文件时获取文件名 其他更新:_Python_Xml_Hadoop_Apache Spark_Pyspark - Fatal编程技术网

Python 使用pyspark从本地系统读取文件时获取文件名 其他更新:

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/")

我尝试为hdfs中存在的文件编写相同的代码,但当我为本地文件系统使用相同的代码时,我遇到了错误。原因:java.io.FileNotFoundException:File File:/root/cd/parsed_cd_5.xml不存在


原始问题和初始更新 我正在使用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
中获取的文件名。我想获取当前文件路径。请帮忙。