come cambiare una colonna Dataframe dal tipo String al tipo Double in pyspark


99

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 poiché durante la regressione logistica, ricevo un errore, quindi mi chiedo, è questo il motivo del problema.

Risposte:


168

Non è necessario un UDF qui. Columnfornisce già il castmetodo con l' istanza :DataType

from pyspark.sql.types import DoubleType

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

o breve stringa:

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

dove i nomi delle stringhe canoniche (possono essere supportate anche altre varianti) corrispondono al simpleStringvalore. 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>'

2
Anche l'uso della colfunzione funziona. from pyspark.sql.functions import col, changedTypedf = joindf.withColumn("label", col("show").cast(DoubleType()))
Staza

Quali sono i possibili valori dell'argomento cast () (la sintassi "stringa")?
Wirawan Purwanto

Non riesco a credere quanto fosse conciso il documento Spark sulla stringa valida per il tipo di dati. Il riferimento più vicino che ho trovato era questo: docs.tibco.com/pub/sfire-analyst/7.7.1/doc/html/en-US/… .
Wirawan Purwanto

1
Come convertire più colonne in una volta?
hui chen

Come si cambia nullable in false?
pitchblack408

48

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

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

3
Grazie, stavo cercando come mantenere il nome della colonna originale
javadba

c'è un elenco da qualche parte dei tipi di dati di stringa breve che Spark identificherà?
alfredox

1
questa soluzione funziona anche splendidamente in un loop, ad esempiofrom pyspark.sql.types import IntegerType for ftr in ftr_list: df = df.withColumn(f, df[f].cast(IntegerType()))
Quetzalcoatl

10

Le risposte date sono sufficienti per affrontare il problema, ma voglio condividere un altro modo in cui potrebbe essere introdotta la nuova versione di Spark (non ne sono sicuro), quindi la risposta data non l'ha colta.

Possiamo raggiungere la colonna nell'istruzione spark con la col("colum_name")parola chiave:

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

5

versione pyspark:

  df = <source data>
  df.printSchema()

  from pyspark.sql.types import *

  # Change column type
  df_new = df.withColumn("myColumn", df["myColumn"].cast(IntegerType()))
  df_new.printSchema()
  df_new.select("myColumn").show()

2

la soluzione era semplice -

toDoublefunc = UserDefinedFunction(lambda x: float(x),DoubleType())
changedTypedf = joindf.withColumn("label",toDoublefunc(joindf['show']))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.