scala - 使用 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()
在这里,我没有任何根标签,我也无法定义多个行标签,所以如果我必须使用上面的单个数据框在单次读取中处理交易和付款,那么如何实现呢?
需要帮忙。
解决方案
让我们用 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
推荐阅读
- c# - Dotnet 5 脚手架更改表名
- amazon-web-services - 在不丢失任何数据的情况下增加 EC2 磁盘存储
- python - 计算非方阵的行列式
- ruby-on-rails - 在 pg_dump 和 pg_restore 之后,本地 PostgreSQL 数据库与 Heroku 上的不同查询计划
- c++ - 初始化变量未返回正确值
- c# - C#如何检查日期时间对象的值是否有一天
- php - 如何在外部 PHP 上使用 Wordpress 函数 - 在任何 wordpress 网站上,不仅仅是我的
- matplotlib - matplotlib 绘图在 vscode 中静默失败,但在同一环境中从 python 解释器工作
- python - 计算 Pagerank 的百分比
- c# - 如何在 WebApi Core 中使用 Unauthorized() 获取空的 http 正文