Saltar al contenido

pyspark crea diccionario a partir de datos en dos columnas

Solución:

Puede evitar usar un udf aquí usando pyspark.sql.functions.struct y pyspark.sql.functions.to_json (Spark versión 2.1 y superior):

import pyspark.sql.functions as f
from pyspark.sql import Row

data = [
    Row(zip_code="58542", dma="MIN"),
    Row(zip_code="58701", dma="MIN"),
    Row(zip_code="57632", dma="MIN"),
    Row(zip_code="58734", dma="MIN")
]

df = spark.createDataFrame(data)

df.withColumn("json", f.to_json(f.struct("dma", "zip_code"))).show(truncate=False)
#+---+--------+--------------------------------+
#|dma|zip_code|json                            |
#+---+--------+--------------------------------+
#|MIN|58542   |{"dma":"MIN","zip_code":"58542"}|
#|MIN|58701   |{"dma":"MIN","zip_code":"58701"}|
#|MIN|57632   |{"dma":"MIN","zip_code":"57632"}|
#|MIN|58734   |{"dma":"MIN","zip_code":"58734"}|
#+---+--------+--------------------------------+

Si en cambio quisieras el zip_code para ser la clave, puedes crear un MapType directamente usando pyspark.sql.functions.create_map:

df.withColumn("json", f.create_map(["zip_code", "dma"])).show(truncate=False)
#+---+--------+-----------------+
#|dma|zip_code|json             |
#+---+--------+-----------------+
#|MIN|58542   |Map(58542 -> MIN)|
#|MIN|58701   |Map(58701 -> MIN)|
#|MIN|57632   |Map(57632 -> MIN)|
#|MIN|58734   |Map(58734 -> MIN)|
#+---+--------+-----------------+

Hay una forma más de convertir su marco de datos en dict. para eso, debe convertir su marco de datos en el par clave-valor rdd, ya que será aplicable solo al par clave-valor rdd. ya que el diccionario en sí es una combinación de pares clave-valor.

data = [
    Row(zip_code="58542", dma="MIN"),
    Row(zip_code="58701", dma="MIN"),
    Row(zip_code="57632", dma="MIN"),
    Row(zip_code="58734", dma="MIN")
]

>>> data.show();
+---+--------+
|dma|zip_code|
+---+--------+
|MIN|   58542|
|MIN|   58701|
|MIN|   57632|
|MIN|   58734|
+---+--------+

convertir su marco de datos en rdd.

newrdd = data.rdd

ya que desea zip_code como clave y dma como valor, por lo que seleccionó el elemento rdd ‘1’ como clave y el elemento ‘0’ como valor.

keypair_rdd = newrdd.map(lambda x : (x[1],x[0]))

una vez que tenga el par de claves rdd, simplemente use collectAsMap para convertirlo en un diccionario

>>> dict = keypair_rdd.collectAsMap()
>>> print dict
{u'58542': u'MIN', u'57632': u'MIN', u'58734': u'MIN', u'58701': u'MIN'}

>>> dict.keys()
[u'58542', u'57632', u'58734', u'58701']

busca valor para una clave específica:

>>> dict.get('58542')
u'MIN'

sí, puedes usar

pyspark.sql.types.MapType(keyType, valueType, valueContainsNull=True)

comparta más información, como la salida de muestra de marco de datos y la forma que desee, como salida que ayudará a escribir un fragmento de código para el mismo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *