es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Al convertir un dataframe de Pandas en un dataframe de Spark, ¿es posible convertir un float en long?

Tengo el siguiente código de preludio que se comparte entre mis dos escenarios:

from pyspark.sql import SparkSession
from pyspark.sql.types import *
import pyspark.sql.functions as F

import pandas as pd
import numpy as np

spark = SparkSession.builder.getOrCreate()

df = pd.DataFrame({"col1": [1, 2, 3], "col2": [22.0, 88.0, np.nan]})

Ahora, me gustaría convertir df en un dataframe de pyspark (sdf). Cuando intento “convertir” col2 implícitamente en LongType a través de un esquema durante la creación de sdf, falla:

schema = StructType([StructField("col1", LongType()), StructField("col2", LongType())])
sdf = spark.createDataFrame(df[schema.fieldNames()], schema=schema)

Error:

TypeError: field col2: LongType no puede aceptar el objeto 22.0 en el tipo <class 'float'="">

Pero si ejecuto el siguiente fragmento, funciona perfectamente:

schema_2 = StructType(
    [StructField("col1", LongType()), StructField("col2", FloatType())]
)
sdf = spark.createDataFrame(df[schema.fieldNames()], schema=schema_2)
cast_sdf = sdf.withColumn("col2", F.col("col2").cast(LongType()))
cast_sdf.show()

con la salida:

+----+----+
|col1|col2|
+----+----+
| 1| 22|
| 2| 88|
| 3| 0|
+----+----+

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    La razón del error al intentar convertir “col2” a LongType se debe a que contiene un valor no entero (es decir, “22.0” es un flotante). LongType solo acepta valores enteros.

    Para solucionar esto, podemos cambiar el esquema para usar FloatType en lugar de LongType para “col2”, o podemos convertir “col2” a FloatType antes de convertirlo explícitamente a LongType. La segunda opción se muestra en el código funcional anterior.

    En el código funcional, creamos un nuevo esquema (schema_2) que utiliza FloatType para “col2”. Luego creamos el dataframe de Spark (sdf) usando este nuevo esquema. Por último, utilizamos la función pyspark.sql.functions.col() para seleccionar la columna “col2” y luego la convertimos a LongType utilizando el método cast(). Este nuevo dataframe (cast_sdf) contiene “col2” convertido a LongType y se puede utilizar para análisis o procesamiento adicional.

Comments are closed.