GOOGLE ADS

domingo, 1 de mayo de 2022

Necesita extraer los datos en función del delimitador y asignarlos al marco de datos en pyspark

Necesita extraer los datos con el delimitador ~~ y asignarlos de acuerdo con las columnas requeridas.

Pero la salida de alguna manera se asigna aleatoriamente y obtiene resultados/asignaciones incorrectos. ¿Cómo podemos lograr esto usando pyspark.

Fecha de muestra: MENSAJE de la columna del marco de datos {5:~~:2016:ABCDEF123~~:2323:002~~:2016:567~~::555:~~XXABC~~:2016:123~~:555:~~ AAAA~~-} {5:~~:2016:DEF~~:2323:009~~:2016:666~~::555:~~ZZZZ~~:2016:788~~:555:~~DDDDD~ ~:2016:5013~~:555:~~TTTTTTTT~~-}

Salida esperada del marco de datos:

PADRE_REF|PARENT_TXN||CHILD_REF|_CHILD_ORG

ABCDEF123|002|567|XXABC

ABCDEF123|002|123|AAAA

DEF | 009 | 666 | ZZZZ

DEF|009|788|DDDDD

DEF|009|5013|TTTTTTTT

Primero 2016 es PARENT_REF Primero 2323 es Padre TXN Subsiguiente 2016 es hijo Ref Susecuente 555 es Niño org

Nota: los registros secundarios pueden variar para un registro principal

Fragmento de código: de las funciones de importación de pyspark.sql como F

df2=df1.select("MENSAJE")

df3=df2.withColumn("PARENT_REF",F.regexp_extract(F.col('MESSAGE'),'{5::.:2016:(.?)~~:"',1)).withColumn("PARENT_TXN ",F.regexp_extract(F.col('MESSAGE'),'{5::.:2323:(.?)~~:"',1)).withColumn("CHILD_REF",F.regexp_extract(F. col('MENSAJE'),'{5::.:2016:(.?)~~:"',1)).withColumn("CHILD_ORG",F.regexp_extract(F.col('MENSAJE'),' {5::.:555:(.?)~~:"',1))

df3.mostrar()


Solución del problema

Solo necesitas escribir una expresión regular correcta

Data de muestra

df = spark.createDataFrame([
('{5:~~:2016:ABCDEF123~~:2323:002~~:2016:567~~::555:~~XXABC~~:2016:123~~:555:~~YYYYY~~-}',),
('{5:~~:2016:DEF~~:2323:009~~:2016:666~~::555:~~ZZZZ~~:2016:788~~:555:~~DDDDD~~:2016:5013~~:555:~~TTTTTTTT~~-}',),
], ['message'])
+------------------------------------------------------------------------------------------------------------+
|message |
+------------------------------------------------------------------------------------------------------------+
|{5:~~:2016:ABCDEF123~~:2323:002~~:2016:567~~::555:~~XXABC~~:2016:123~~:555:~~YYYYY~~-} |
|{5:~~:2016:DEF~~:2323:009~~:2016:666~~::555:~~ZZZZ~~:2016:788~~:555:~~DDDDD~~:2016:5013~~:555:~~TTTTTTTT~~-}|
+------------------------------------------------------------------------------------------------------------+

Transformación

(df
.withColumn('parent_ref',F.regexp_extract(F.col('message'), '\{5:~~:2016:([^~]+)~~:2323:([^~]+)~~([^-]+)-}', 1))
.withColumn('parent_txn',F.regexp_extract(F.col('message'), '\{5:~~:2016:([^~]+)~~:2323:([^~]+)~~([^-]+)-}', 2))
.withColumn('children', F.regexp_extract(F.col('message'), '\{5:~~:2016:([^~]+)~~:2323:([^~]+)~~([^-]+)-}', 3))
.withColumn('child', F.explode(F.split('children', ':2016:')))
.where(F.col('child')!= '')
.withColumn('child_ref', F.regexp_extract(F.col('child'), '^([^~]+)', 1))
.withColumn('child_org', F.regexp_extract(F.col('child'), '~~([^~]+)~~$', 1))
.drop('message', 'children', 'child')
.show(10, False)
)
+----------+----------+---------+---------+
|parent_ref|parent_txn|child_ref|child_org|
+----------+----------+---------+---------+
|ABCDEF123 |002 |567 |XXABC |
|ABCDEF123 |002 |123 |YYYYY |
|DEF |009 |666 |ZZZZ |
|DEF |009 |788 |DDDDD |
|DEF |009 |5013 |TTTTTTTT |
+----------+----------+---------+---------+

No hay comentarios:

Publicar un comentario

Regla de Firestore para acceder a la generación de subcolección Permisos faltantes o insuficientes

Tengo problemas con las reglas de Firestore para permitir el acceso a algunos recursos en una subcolección. Tengo algunos requests document...