python - cast - pyspark astype
cómo cambiar una columna de marco de datos de tipo de cadena a tipo doble en pyspark (4)
Tengo un marco de datos con una columna como String. Quería cambiar el tipo de columna a Tipo doble en PySpark.
El siguiente es el camino que hice:
toDoublefunc = UserDefinedFunction(lambda x: x,DoubleType())
changedTypedf = joindf.withColumn("label",toDoublefunc(joindf[''show'']))
Solo quería saber si esta es la forma correcta de hacerlo, ya que mientras estoy ejecutando la Regresión logística, recibo algún error, por lo que me pregunto si esta es la razón del problema.
Las respuestas dadas son suficientes para lidiar con el problema, pero quiero compartir otra forma en la que se puede presentar la nueva versión de Spark (no estoy seguro de eso), por lo que la respuesta dada no lo entendió.
Podemos llegar a la columna en la declaración de chispa con la palabra clave
col("colum_name")
:
from pyspark.sql.functions import col , column
changedTypedf = joindf.withColumn("show", col("show").cast("double"))
No hay necesidad de un UDF aquí.
Column
ya proporciona el
método
de
DataType
con la
instancia de
DataType
:
from pyspark.sql.types import DoubleType
changedTypedf = joindf.withColumn("label", joindf["show"].cast(DoubleType()))
o cadena corta:
changedTypedf = joindf.withColumn("label", joindf["show"].cast("double"))
donde los nombres de cadenas canónicas (también se pueden
simpleString
otras variaciones) corresponden al valor
simpleString
.
Entonces, para los tipos atómicos:
from pyspark.sql import types
for t in [''BinaryType'', ''BooleanType'', ''ByteType'', ''DateType'',
''DecimalType'', ''DoubleType'', ''FloatType'', ''IntegerType'',
''LongType'', ''ShortType'', ''StringType'', ''TimestampType'']:
print(f"{t}: {getattr(types, t)().simpleString()}")
BinaryType: binary
BooleanType: boolean
ByteType: tinyint
DateType: date
DecimalType: decimal(10,0)
DoubleType: double
FloatType: float
IntegerType: int
LongType: bigint
ShortType: smallint
StringType: string
TimestampType: timestamp
y por ejemplo tipos complejos
types.ArrayType(types.IntegerType()).simpleString()
''array<int>''
types.MapType(types.StringType(), types.IntegerType()).simpleString()
''map<string,int>''
Preserve el nombre de la columna y evite la adición de columnas adicionales utilizando el mismo nombre que la columna de entrada:
changedTypedf = joindf.withColumn("show", joindf["show"].cast(DoubleType()))
la solución fue simple:
toDoublefunc = UserDefinedFunction(lambda x: float(x),DoubleType())
changedTypedf = joindf.withColumn("label",toDoublefunc(joindf[''show'']))