0
votes

Extraire la chaîne de Dataframe

Je cherche à extraire une chaîne d'une colonne de données XML (chaîne) dans My Pyspark Dataframe. Je cherche à extraire la valeur du nom du produit pour chaque client.

ci-dessous est un exemple de données: p>

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


1 commentaires

Utilisez cette libère de Data Databicks - Github.com/databricks/spark-xml


3 Réponses :


0
votes

Si votre structure XML est statique, remplacez simplement les chaînes XML environnantes avec ";" (Utilisez Remplacer ou Regexp_replace ), laissant les valeurs et créer une nouvelle colonne avec le résultat ( Sans column méthode).


0 commentaires

0
votes

Créer un UDF simple

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 commentaires

0
votes

dans 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 commentaires