column cast astype python apache-spark dataframe apache-spark-1.4 pyspark apache-spark-sql

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'']))