2017-03-16 15 views
1

私は、一連のXML文書をインタラクティブに探検したいと思っています。私はfind、findall、およびxpathメソッドを使ってlxmlとqueryを使って文書を解析しようとしています。しかし、PySparkが要素オブジェクトの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を使用して、シリアライズPythonオブジェクトを取得することができます:

from operator import attrgetter 

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