我有一个数据框,其中包含带有 XML 字符串的字符串数据类型列。现在我想使用原始列的嵌套 XML 结构创建一个新列。为此,我尝试在 PySpark 中使用 XPath。
假设我有字符串格式的 XML:
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book category="cooking">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<description>
<tag1>Example text 1</tag1>
<tag2>Example text 2</tag2>
<tag4>Example text 3</tag4>
</description>
<year>2005</year>
<price>30.00</price>
</book>
</bookstore>
现在,我想从另一列中字符串中的
<description>
标签获取嵌套的 XML 结构,即
<description>
<tag1>Example text 1</tag1>
<tag2>Example text 2</tag2>
<tag4>Example text 3</tag4>
</description>
就这样。
例如,原始列是
original_content
,其中:
"<?xml version="1.0" encoding="UTF-8"?><bookstore><book category="cooking"><title lang="en">Everyday Italian</title><author>Giada De Laurentiis</author><description><tag1>Example text 1</tag1><tag2>Example text 2</tag2><tag4>Example text 3</tag4></description><year>2005</year><price>30.00</price></book></bookstore>"
现在我想用
nested_content
添加一个新列 .withColumn
到数据框中,内容应该是:
"<description><tag1>Example text 1</tag1><tag2>Example text 2</tag2><tag4>Example text 3</tag4></description>"
例如,在 XPath 中:
df = df.withColumn("new", xpath(col("content"), lit('/bookstore/book/description/*')))
*
和text()
都不起作用,无法给出NULL
值。
我对 PySpark 了解不多,但我知道 XPath 表达式
/bookstore/book/description/*
将返回 3 个元素的序列(a tag1
、a tag2
和 tag4
)。 XPath 中的最后一个 /*
检索作为 description
元素子级的任何名称的元素。如果您想引用 description
元素本身,请从表达式中删除最后的 /*
。