首页 > 解决方案 > 从 DataFrame 中提取字符串

问题描述

我希望从我的 pyspark 数据框中的一列 XML 数据(字符串)中提取一个字符串。我希望为每个客户提取 ProductName 的值。

以下是数据示例:

 Customer, Product
 A, <XmlData ProductName="123">....</XmlData><XmlData ProductName="1452">....</XmlData>
 B, <XmlData ProductName="123">....</XmlData>
 C, <XmlData ProductName="123">....</XmlData><XmlData ProductName="1452">....</XmlData><XmlData ProductName="893">....</XmlData><XmlData ProductName="3453">....</XmlData>

我想转换我的数据框以包含一个列,该列具有提取的 ProductNames 列表,如下所示:

 Customer, ProductName
 A, 123;1452
 B, 123
 C, 123;1452;893;3453

标签: apache-sparkpyspark

解决方案


创建一个简单的udf

import re
from pyspark.sql.functions import udf

extract = udf(lambda s: list(map(lambda x: x.split('=')[1] if len(x)>0 else x,re.findall('(ProductName=\"\d+\")', s))), ArrayType(StringType()))

df.withColumn('values', extract('Product')).show(30,False)

+--------+--------------------+--------------------+
|Customer|             Product|              values|
+--------+--------------------+--------------------+
|       A|<XmlData ProductN...|     ["123", "1452"]|
|       B|<XmlData ProductN...|             ["123"]|
|       C|<XmlData ProductN...|["123", "1452", "...|
|       D|                    |                  []|
+--------+--------------------+--------------------+

df = df.withColumn('values',f.concat_ws(';','values'))

推荐阅读