Estoy tratando de usar pyspark para hacer algunas manipulaciones a los datos, pero tengo un problema que parece que no puedo resolver. Básicamente, tengo 2 columnas que contienen una cadena de fecha

field1 (string): date1 date2 date3 date4 date5
field2 (string): 0.0 1.0 2.0 3.0 4.0

Cada valor está relacionado entre sí (por lo que la fecha1 está relacionada con el primer valor en el campo2, la fecha2 está relacionada con el segundo valor en el campo2, etc.

Lo que quiero lograr es convertir el marco de datos en filas como:

field1  field2
date1   0.0
date2   1.0
date3   2.0
date4   3.0
date5   4.0

He intentado:

df.split(field1, ' ')
df.explode(field1)

df.split(field2, ' ')
df.explode(field2)

Pero esto creará una multiplicación:

field1  field2
date1   0.0
date1   1.0
date1   2.0
date1   3.0
date1   4.0
date2   0.0
date2   1.0
date2   2.0
date2   3.0
date2   4.0
etc..

Entonces pensé que debería dividir la cadena y luego hacer un mapa

df.split(field1, ' ')
df.split(field2, ' ')
df.create_map(field1,field2).alias(mapped_val)
df.explode(mapped_val)

Sin embargo, esto no funciona porque obtengo un error en create_map:

 TypeError: Unhasable type: list

No estoy seguro de cómo podría hacer que esto funcione, ¿cómo convertiría la salida de split () en algo que funcione con create_map?

1
eureka 31 ago. 2020 a las 17:29

1 respuesta

La mejor respuesta

Puede comprimir las matrices y explotar, volver a seleccionarlo en el marco de datos.

df = spark.createDataFrame([('date1 date2 date3 date4 date5', '0.0 1.0 2.0 3.0 4.0')]).toDF('col1', 'col2')

from pyspark.sql.functions import *

df.withColumn('array', arrays_zip(split('col1', ' '), split('col2', ' '))) \
  .withColumn('array', explode('array')) \
  .select('array.*').toDF('col1', 'col2').show()

+-----+----+
| col1|col2|
+-----+----+
|date1| 0.0|
|date2| 1.0|
|date3| 2.0|
|date4| 3.0|
|date5| 4.0|
+-----+----+
1
Lamanus 31 ago. 2020 a las 23:37