En python y pandas, puedo crear una nueva columna como esta:

Usando dos columnas en el marco de datos de pandas para crear un dictado.

 dict1 = dict(zip(data["id"], data["duration"]))

Entonces puedo aplicar este dictado para crear una nueva columna en un segundo marco de datos.

df['id_duration'] = df['id'].map(lambda x: dict1[x] if x in dict1.keys() else -1)

¿Cómo puedo crear una nueva columna id_duration en el marco de datos de Spark sql, en caso de que tenga un marco de datos data (con dos columnas: id y duration) y un marco de datos df (que tiene una columna id)?

0
Matty 22 ene. 2021 a las 05:54

1 respuesta

La mejor respuesta

Usar un diccionario sería una lástima porque necesitaría recopilar el marco de datos completo data en el controlador, lo que será muy malo para el rendimiento y podría causar un error OOM.

Simplemente puede realizar una unión externa izquierda entre los dos marcos de datos y usar na.fill para llenar los valores vacíos con -1.

data = spark.createDataFrame([(1, 10), (2, 20), (3, 30)], ['id', 'duration'])
df = spark.createDataFrame([(1, 2), (3, 4)], ['id', 'x'])

df\
    .join(data.withColumnRenamed("duration", "id_duration"), ['id'], 'left')\
    .na.fill(-1).show()
+---+---+-----------+
| id|  x|id_duration|
+---+---+-----------+
|  5|  6|         -1|
|  1|  2|         10|
|  3|  4|         30|
+---+---+-----------+
1
Oli 22 ene. 2021 a las 08:36