2017-03-16 5 views
1

일련의 XML 문서를 대화 형으로 탐색하고 싶습니다. find, findall 및 xpath 메서드를 사용하여 lxml 및 쿼리를 사용하여 문서를 구문 분석하려고합니다. 그러나 PySpark는 Element 객체의 RDD를 만들려고 시도합니다.lxml.Element 객체의 Spark Python RDD?

from lxml import etree 
from lxml.etree import XMLSyntaxError 
def get_root(xml): 
    xml_bytes = bytes(bytearray(xml, encoding = 'utf-8')) 
    try: 
    return [etree.XML(xml_bytes)] 
    except XMLSyntaxError: 
    return [] 

docs = [ 
    "<doc><tag name='hoo'>hah</tag><tag name='wah'>zoo</tag></doc>" 
    , "<doc><tag name='hoo'>yah</tag><tag name='wah'>woo</tag></doc>" 
] 
roots = [get_root(x)[0] for x in docs] 
roots 
    [<Element doc at 0x3b2280>, <Element doc at 0x3b2140>] 
docs_rdd = sc.parallelize(docs) 
roots_rdd = docs_rdd.flatMap(lambda d: get_root(d)) 
roots_rdd.count() 
    2 
roots_rdd.first() 
    Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "lxml.etree.pyx", line 1033, in lxml.etree._Element.__repr__ (src/lxml/lxml.etree.c:42268) 
    File "lxml.etree.pyx", line 881, in lxml.etree._Element.tag.__get__ (src/lxml/lxml.etree.c:40855) 
    File "apihelpers.pxi", line 15, in lxml.etree._assertValidNode (src/lxml/lxml.etree.c:12875) 
    AssertionError: invalid Element proxy at 62728864 

누군가가 내가 무슨 일이 일어나고 있는지 이해할 수있게 도와 줄 수 있습니까?

python 2.7.x 또는 3.5.x, spark 1.6.x, pip 또는 pip3과 함께 설치되는 lxml.

미리 감사드립니다.

답변

1

lxml 개체는 직렬화 할 수 없으며 실행 프로그램과 드라이버간에 전달되거나 섞여있을 수 없습니다. 쉽게 모든 불꽃을 사용하지 않고 재현 할 수 있습니다 :

from lxml import etree 
import pickle 

pickle.loads(pickle.dumps(etree.XML("<doc>foo</doc>"))) 
AssertionError       Traceback (most recent call last) 
... 
AssertionError: invalid Element proxy at ... 

당신은 여전히 ​​구문 분석 lxml 사용하여 직렬화 파이썬 객체 가져올 수 :

from operator import attrgetter 

docs_rdd.flatMap(get_root).flatMap(lambda x: x).map(attrgetter("text")).collect() 
['hah', 'zoo', 'yah', 'woo']