从Dataframe中提取字符串

gfttwv5a  于 2021-05-29  发布在  Spark
关注(0)|答案(3)|浏览(509)

我希望从pysparkDataframe中的一列xml数据(string)中提取一个字符串。我想为每个客户提取产品名称的价值。
以下是数据示例:

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>

我想将我的数据框转换为包含一列,该列包含如下所示的已提取产品名称列表:

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

gg58donl1#

创建一个简单的自定义项

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'))
l0oc07j2

l0oc07j22#

如果您的xml结构是静态的,只需将周围的xml字符串替换为“;”(使用replace或regexp\u replace),保留值,并使用结果创建一个新列(withcolumn方法)。

q3aa0525

q3aa05253#

在斯卡拉-

val regexp_extractAll = udf((xml: String, exp: String) =>
      exp.r.findAllMatchIn(xml).map(_.group(1)).mkString(";")
    )

    df.withColumn("ProductName", regexp_extractAll($"Product", lit("""ProductName="(\d+)"""")))
      .show(false)

    /**
      * +--------+-----------------------------------------------------------------------------+--------+
      * |Customer|Product                                                                      |ProductName       |
      * +--------+-----------------------------------------------------------------------------+--------+
      * |A       |<XmlData ProductName="123">x</XmlData><XmlData ProductName="1452">y</XmlData>|123;1452|
      * |B       |<XmlData ProductName="123">x</XmlData>                                       |123     |
      * |C       |<XmlData ProductName="123">x</XmlData><XmlData ProductName="1452">y</XmlData>|123;1452|
      * +--------+-----------------------------------------------------------------------------+--------+
      */

相关问题