web-dev-qa-db-fra.com

comment changer une colonne Dataframe de type String en type Double dans pyspark

J'ai un dataframe avec column comme String ..__ Je voulais changer le type de colonne en Double type dans PySpark.

Voici le chemin, j'ai fait:

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

Je voulais juste savoir, est-ce la bonne façon de le faire, alors que j'exécute une erreur au travers de la régression logistique, alors je me demande, est-ce la raison du problème?.

49
Abhishek Choudhary

Il n'y a pas besoin d'un FDU ici. Column fournit déjà cast méthode avec une instance DataType:

from pyspark.sql.types import DoubleType

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

ou ficelle courte:

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

où les noms de chaînes canoniques (d'autres variantes peuvent également être supportées) correspondent à la valeur simpleString. Donc pour les types atomiques:

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

et par exemple des types complexes

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

Conservez le nom de la colonne et évitez toute addition de colonne supplémentaire en utilisant le même nom que la colonne d'entrée:

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

Les réponses données sont suffisantes pour traiter le problème, mais je souhaite partager un autre moyen d'introduire la nouvelle version de Spark (je ne suis pas sûr de cela) donc la réponse fournie ne l'a pas compris.

Nous pouvons atteindre la colonne dans l'instruction spark avec le mot clé col("colum_name"):

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

la solution était simple -

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