apache-spark - 从 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
解决方案
创建一个简单的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'))
推荐阅读
- command-line-interface - 安装 platformsh CLI 时 Bash 显示错误
- android - 如何从视图模型的存储库中获取 LiveData 的值?
- javascript - 如何在 vuetify v-carousel 中使用 v-bind 显示来自 Firebase 存储网络的图像?
- html - 在网络应用程序谷歌应用程序脚本上呈现部分谷歌电子表格
- php - 根据 ID 向 woocommerce 商店网站添加自定义描述
- javascript - 更改 fillStyle 以将图像添加到游戏对象
- sql-server - 使用 WindowsForm 在 Visual Basic 中创建过程和复选框
- java - apache derby 中的外键是否会自动填充列?
- laravel - 如何仅在laravel中的前一周记录上添加编辑按钮
- c# - .NET Core 中不支持此类接口 (0x80004002)