【发布时间】:2017-09-04 11:56:58
【问题描述】:
我正在尝试在 pyspark 中解析 xml。我有一个目录,其中包含许多小的 xml 文件,我想解析所有的 xml,并将其放在 hdfs 中,因为我在下面的代码中编写了这些文件。
代码:
import xml.etree.ElementTree as ET
from subprocess import Popen, PIPE
import pickle
filenme = sc.wholeTextFiles("/user/root/CD")
dumpoff1 = Popen(["hadoop", "fs", "-put", "-", "/user/cloudera/Demo/Demo.txt"],stdin=PIPE)
def getname(filenm):
return filenm[1]
def add_hk(filenm):
source=[]
global dumpoff1
doc = ET.fromstring(filenm)
for elem1 in doc.findall('.//documentInfo/source'):
source.append(elem1.text)
print source[0]
dumpoff1.stdin.write("%s\n" % source[0])
filenme.map(getname).foreach(add_hk)
但是当我运行它时,我遇到了错误。
错误:
文件 "/opt/cloudera/parcels/CDH-5.11.0-1.cdh5.11.0.p0.34/lib/spark/python/pyspark/cloudpickle.py", 第 582 行,在 save_file 中 raise pickle.PicklingError("Cannot pickle files that are not open for reading") pickle.PicklingError: Cannot pickle files that 不开放阅读
我尝试在 add_hk 中编写 Popen 然后我没有收到 pickle 错误,但 Demo.txt 被覆盖并且只有最新的文件值。请帮忙。
【问题讨论】:
-
Pickle 错误意味着您返回的数据类型不是 pyspark 处理的
-
wholeTextFiles将文件名写入索引0而不是1(在getname中)。 -
您能否提供一些元素,例如您的文件是什么样的,是本地路径,
add_hk做什么 -
@Marie 我不能共享这些文件,因为它是机密的。
add_hk获取 xml 文件的内容并返回。 -
@Marie 我想要文件的内容,因为我的文件存在于 hdfs 中,我无法将文件路径传递给函数,因为它只能在本地路径中使用。
标签: python hadoop pyspark pickle