使用pyspark

时间:2017-08-24 15:01:04

标签: python xml hadoop apache-spark pyspark

其他更新:

我尝试为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)

2 个答案:

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

现在路径包含文件中的文字您感兴趣的位置。

如果你尝试在那上面运行你的后续命令,那么它会尝试做一些奇怪的事情(因而失败)。