如何从 spark 数据框列中读取 xml 数据
How to read xml data from a spark dataframe column
我有一个 spark 数据框,它有一个列 value
、key
和其他列,value
列有一个 xml as string
现在我想创建一个新的数据框,其中 value
列的 xml 内容被读取为好像我正在读取 spark.read.xml
并附加其他列,如 [=14] =] 到新的 DF
这可能吗?
我通常使用这个
阅读xml文件
dfx = spark.read.load('books.xml', format='xml', rowTag='bks:books', valueTag="_ele_value")
dfx.schema
尝试从 value
列读取时尝试获得类似的数据帧输出(这来自 kafka)
我的 xml 有很深的嵌套结构,只是书的一个例子 xml 有 2 层嵌套
<?xml version="1.0" encoding="UTF-8"?>
<bks:books xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bks="urn:books"
xsi:schemaLocation="urn:books books.xsd" xmlns:ot="http://maven.apache.org/POM/4.0.0">
<book id="b001">
<author>Brandon Sanderson</author>
<title>Mistborn</title>
<genre sub='epic'>Fantasy</genre>
<price>50</price>
<pub_date>2006-12-17T09:30:47.0Z</pub_date>
<review>
<title>Wonderful</title>
<content>I love the plot twist and the new magic</content>
</review>
<review>
<title>Unbelievable twist</title>
<content>The best book i ever read</content>
</review>
<sold>10</sold>
</book>
<book id="b002">
<author>Brandon Sanderson</author>
<title>Way of Kings</title>
<genre sub='epic'>Fantasy</genre>
<price>50</price>
<pub_date>2006-12-17T09:30:47.0Z</pub_date>
<sold>10</sold>
</book>
</bks:books>
看起来这可以使用 XmlReader 实现(但仅在 scala 中)
val rdd:RDD[String] = df.select("value").as[String].rdd
var schema: StructType = null
var parameters = collection.mutable.Map("rowTag" -> "bks:books", "valueTag" -> "_ele_value")
val new_df = new XmlReader().withRowTag("bks:books").withValueTag("_ele_value").withSchema(schema).xmlRdd(spark, rdd)
但这种方法的问题是,我们失去了 value
与初始数据帧中其他列之间的任何关系
如果有人知道 link 的方法,请告诉我:)
我有一个 spark 数据框,它有一个列 value
、key
和其他列,value
列有一个 xml as string
现在我想创建一个新的数据框,其中 value
列的 xml 内容被读取为好像我正在读取 spark.read.xml
并附加其他列,如 [=14] =] 到新的 DF
这可能吗?
我通常使用这个
阅读xml文件dfx = spark.read.load('books.xml', format='xml', rowTag='bks:books', valueTag="_ele_value")
dfx.schema
尝试从 value
列读取时尝试获得类似的数据帧输出(这来自 kafka)
我的 xml 有很深的嵌套结构,只是书的一个例子 xml 有 2 层嵌套
<?xml version="1.0" encoding="UTF-8"?>
<bks:books xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bks="urn:books"
xsi:schemaLocation="urn:books books.xsd" xmlns:ot="http://maven.apache.org/POM/4.0.0">
<book id="b001">
<author>Brandon Sanderson</author>
<title>Mistborn</title>
<genre sub='epic'>Fantasy</genre>
<price>50</price>
<pub_date>2006-12-17T09:30:47.0Z</pub_date>
<review>
<title>Wonderful</title>
<content>I love the plot twist and the new magic</content>
</review>
<review>
<title>Unbelievable twist</title>
<content>The best book i ever read</content>
</review>
<sold>10</sold>
</book>
<book id="b002">
<author>Brandon Sanderson</author>
<title>Way of Kings</title>
<genre sub='epic'>Fantasy</genre>
<price>50</price>
<pub_date>2006-12-17T09:30:47.0Z</pub_date>
<sold>10</sold>
</book>
</bks:books>
看起来这可以使用 XmlReader 实现(但仅在 scala 中)
val rdd:RDD[String] = df.select("value").as[String].rdd
var schema: StructType = null
var parameters = collection.mutable.Map("rowTag" -> "bks:books", "valueTag" -> "_ele_value")
val new_df = new XmlReader().withRowTag("bks:books").withValueTag("_ele_value").withSchema(schema).xmlRdd(spark, rdd)
但这种方法的问题是,我们失去了 value
与初始数据帧中其他列之间的任何关系
如果有人知道 link 的方法,请告诉我:)