Извлечь строку из DataFrame - PullRequest
0 голосов
/ 18 июня 2020

Я хочу извлечь строку из столбца данных XML (строка) в моем фреймворке pyspark. Я хочу извлечь ценность 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

Ответы [ 3 ]

0 голосов
/ 18 июня 2020

Создать простой 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'))
0 голосов
/ 18 июня 2020

В Scala -

  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|
      * +--------+-----------------------------------------------------------------------------+--------+
      */
0 голосов
/ 18 июня 2020

Если ваша структура XML является stati c, просто замените окружающие строки XML на ";" (используйте replace или regexp_replace ), оставив значения, и создайте новый столбец с результатом (метод withColumn ).

...