it-swarm.dev

come cambiare una colonna Dataframe da tipo String a Double type in pyspark

Ho un dataframe con colonna come String . Volevo cambiare il tipo di colonna in Double type in PySpark.

Di seguito è il modo, ho fatto:

toDoublefunc = UserDefinedFunction(lambda x: x,DoubleType())
changedTypedf = joindf.withColumn("label",toDoublefunc(joindf['show']))

Volevo solo sapere, è questo il modo giusto per farlo mentre si esegue Attraverso la regressione logistica, sto ottenendo un errore, quindi mi chiedo, È questa la ragione del problema.

49

Non c'è bisogno di un UDF qui. Column fornisce già cast metodo con DataType istanza:

from pyspark.sql.types import DoubleType

changedTypedf = joindf.withColumn("label", joindf["show"].cast(DoubleType()))

o una stringa breve:

changedTypedf = joindf.withColumn("label", joindf["show"].cast("double"))

dove i nomi delle stringhe canoniche (anche altre varianti possono essere supportati) corrispondono al valore simpleString. Quindi per i tipi atomici:

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

e per esempio tipi complessi

types.ArrayType(types.IntegerType()).simpleString()   
'array<int>'
types.MapType(types.StringType(), types.IntegerType()).simpleString()
'map<string,int>'
93
zero323

Conserva il nome della colonna ed evita l'aggiunta di ulteriori colonne utilizzando lo stesso nome della colonna di input:

changedTypedf = joindf.withColumn("show", joindf["show"].cast(DoubleType()))
37
Disha

Risposte date sono sufficienti per affrontare il problema ma voglio condividere un altro modo che può essere introdotto la nuova versione di Spark (non ne sono sicuro) quindi la risposta data non la cattura.

Possiamo raggiungere la colonna nella dichiarazione di accensione con la parola chiave col("colum_name"):

from pyspark.sql.functions import col , column
changedTypedf = joindf.withColumn("show", col("show").cast("double"))
3
serkan kucukbay

la soluzione era semplice -

toDoublefunc = UserDefinedFunction(lambda x: float(x),DoubleType())
changedTypedf = joindf.withColumn("label",toDoublefunc(joindf['show']))
2