【问题标题】:Pickle error in PysparkPyspark 中的泡菜错误
【发布时间】: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


【解决方案1】:

您应该使用 spark SQL 加载您的 xmlfiles,然后将它们写入 hdfs:

假设/user/root/CD/是本地路径(否则去掉file://):

df = spark.read.format('com.databricks.spark.xml').options(rowTag='page').load('file:///user/root/CD/*')

你可以写成parquet:

df.write.parquet([HDFS path])

【讨论】:

  • 由于我的文件在 hdfs 中,我是否必须更改 load('file:///user/root/CD/*') 声明?
  • 是的 :) 并且您应该修改 rowTag 以适合您的数据
猜你喜欢
  • 2018-09-09
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-09
相关资源
最近更新 更多