我有以下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
答案 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')