如何在pyspark中解析嵌套的xml

时间:2018-03-26 14:39:08

标签: xml pyspark

我有以下xml文档

<a date="26-03-2018" id="1">
<text>
</text>
<metadata>
<b>
<c c="STRING1">
<d="value" e="string"/>
</c>
<c c="STRING2">
<d="value2" e="string" />
</c>
</b>
</metadata>
</a>

通过使用数据块xml解析器,我想将“c”的string1,string2值作为列表提取到数据帧的列[元数据],但是当我使用自定义模式推断时

schema = StructType([
StructField("date", StringType(), True),
StructField("id", LongType(), True),
StructField("text", StringType(), True),
StructField("metadata", StructType([
StructField("b", StringType(), True)]), True),])

以及上述架构的数据框

----------------------------------------------------------------------------------------------------------------------
 Id | date       | text | metadata 
----------------------------------------------------------------------------------------------------------------------
 1  | 26-03-2018 | text |' <c c="STRING1"> <d="value" e="string"/></c><c c="STRING2"><d="value2" e="string" /> </c>'

我从'b'节点获取整个数据字符串。关于如何使用databricks xml解析器将字符串提取到名为metadata的列的任何想法,或者是否有任何其他解析器可用。我找不到正确的解决方案。我是新来的火花。 TIA

1 个答案:

答案 0 :(得分:0)

您可以使用rdd来解析ElementTree库。

from pyspark.sql import Row
import xml.etree.ElementTree as ET

row_counter = Row('columnName1', 'columnName2', 'columnName3')

def parser_xml(string_xml):
   root = ET.fromstring(string_xml.encode('ISO-8859-1', errors='replace'))
   ''' Implement all parser logic
   '''
   columnName1 = root.find('test').attrib['value1']
   columnName2 = root.find('test2').attrib['value2']
   columnName3 = root.find('test3').attrib['value3']

   return row_counter(columnName1, columnName2, columnName3)

rdd = sc.wholeTextFiles("/files/*.xml")
data = rdd.map(lambda (string_file): parser_xml(string_file[1])) 
df = spark.createDataFrame(data, schema=None, samplingRatio=None, verifySchema=True)
df.write.parquet('output')