首页 > 解决方案 > 使用 spark 解析具有多个行标签的 xml

问题描述

我想使用 spark 解析 xml,所以我使用 spark databricks lib。示例xml如下:

<Transactions>
        <Transaction>                
                <transid>1111</transid>                
        </Transaction>  
        <Transaction>                
                <transid>2222</transid>                
        </Transaction>      
</Transactions>
<Payments>
    <Payment>
        <Id>123</Id>
    </Payment>
    <Payment>
        <Id>456</Id>
    </Payment>
</Payments>

要解析的代码:

val transNestedDF = sqlContext.read.format("com.databricks.spark.xml").option("rowTag","Transactions").load("trans_nested.xml")

transNestedDF.registerTempTable("TransNestedTbl")

sqlContext.sql("select Transaction[0].transid from TransNestedTbl").collect()

在这里,我没有任何根标签,我也无法定义多个行标签,所以如果我必须使用上面的单个数据框在单次读取中处理交易和付款,那么如何实现呢?

需要帮忙。

标签: scalaapache-sparkxml-parsingdatabricks

解决方案


让我们用 lxml 试试这个,一个 python 库,它本身使用 xpath:

如果您没有安装它,您需要:

pip intall lxml

然后:

import lxml.html

pay = """ [your code above]  """

doc = lxml.html.fromstring(pay)
tid =doc.xpath('Transactions//transid'.lower()) #or ('//Transactions//transid'.lower()) depending on the structure of the original doc
pid = doc.xpath('Payments//id'.lower()) #same comment

final = ''
for i in tid:
    for p in pid:            
        final = final+i.text+'|'+p.text+' \n'

print(final)

输出:

1111|123 
1111|456 
2222|123 
2222|456 

推荐阅读