xml - Spark Scala - 将数据框中的 XML 列转换为多列
问题描述
我有一个数据框,它有两列,一个 pk 和一个 xml 字符串。我需要将 xml 字符串转换为该数据框中的列。
前任。
|pk|xml_string|
|1|<root><EventDate>2019-01-01</EventDate><EventCode>7</EventCode></root>|
|2|<root><EventDate>2019-05-01</EventDate><EventCode>8</EventCode></root>|
|3|<root><EventDate>2019-08-01</EventDate><EventCode>9</EventCode></root>|
需要把它变成:
|pk|EventDate|EventCode|
|1|2019-01-01|7|
|2|2019-05-01|8|
|3|2019-08-01|9|
//working to potentially map it before parsing, but haven't gotten far
%spark
import scala.xml._
val blob = sqlContext.table("inspecRiskBlob")
val blobMap = blob
.rdd.map(row => (
row.getString(0),
row.getString(1))
).collectAsMap()
解决方案
欢迎来到SO。一种选择是使用 json4s 之类的库将您的 XML 转换为 JSON,然后使用 Spark 的内置 JSON 函数来操作您的数据,但是对于像这样的简单案例,您确实可以使用 Scala 的 XML 模块来提取您需要的值:
scala> import scala.xml.XML
import scala.xml.XML
scala> val in = Seq(("1", "<xml><date>2019-01-01</date><eventId>11</eventId></xml>"), ("2", "<xml><date>2019-01-02</date><eventId>22</eventId></xml>")).toDS
in: org.apache.spark.sql.Dataset[(String, String)] = [_1: string, _2: string]
scala> val extracted = in.map{
| case (id : String, xml : String) =>
| val x = XML.loadString(xml)
| (id, (x \ "date").text, (x \ "eventId").text)
| }.toDF("pk", "date", "event")
extracted: org.apache.spark.sql.DataFrame = [pk: string, date: string ... 1 more field]
scala> extracted.show(false)
+---+----------+-----+
|pk |date |event|
+---+----------+-----+
|1 |2019-01-01|11 |
|2 |2019-01-02|22 |
+---+----------+-----+
推荐阅读
- android - android webview下方不需要的空格
- snakemake - 如何读取 config.yaml 文件并将其输入到 snakemake
- javascript - 将多个脚本标签附加到在 React 中同步执行的头部
- android - Android 10:可绘制图像褪色问题(Whities 背景)
- apache-flink - 有没有办法丢弃部分匹配?
- grafana - 如何删除grafana中的单个数据点?
- c# - Entity Framework Core - 与版本 5+ 无关的输出数据库
- mysql - 如何使用 MYSQL 从给定的两个日期获取小时和分钟
- ios - App Store - 应用隐私 - 无法更新应用隐私问题(管理员)
- pandas - 将两个 DF 合并为一个 pandas DF