首页 > 解决方案 > 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()

标签: xmlscalaapache-spark

解决方案


欢迎来到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   |
+---+----------+-----+

推荐阅读