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

99

J'ai un dataframe avec une colonne sous forme de chaîne. Je voulais changer le type de colonne en type Double dans PySpark.

Voici le chemin que 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, car en exécutant la régression logistique, je reçois une erreur, alors je me demande si c'est la raison du problème.

Abhishek Choudhary
la source

Réponses:

170

Il n'y a pas besoin d'un UDF ici. Columnfournit déjà une castméthode avec instance :DataType

from pyspark.sql.types import DoubleType

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

ou chaîne courte:

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

où les noms de chaînes canoniques (d'autres variantes peuvent également être prises en charge) correspondent à la simpleStringvaleur. 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>'
zéro323
la source
2
L'utilisation de la colfonction fonctionne également. from pyspark.sql.functions import col, changedTypedf = joindf.withColumn("label", col("show").cast(DoubleType()))
Staza
Quelles sont les valeurs possibles de l'argument cast () (la syntaxe "string")?
Wirawan Purwanto
Je ne peux pas croire à quel point Spark doc était laconique sur la chaîne valide pour le type de données. La référence la plus proche que j'ai pu trouver était la suivante: docs.tibco.com/pub/sfire-analyst/7.7.1/doc/html/en-US/… .
Wirawan Purwanto
1
Comment convertir plusieurs colonnes en une seule fois?
hui chen
Comment changer nullable en false?
pitchblack408
50

Conservez le nom de la colonne et évitez l'ajout de colonnes supplémentaires en utilisant le même nom que la colonne d'entrée:

changedTypedf = joindf.withColumn("show", joindf["show"].cast(DoubleType()))
Caneton
la source
3
Merci, je cherchais comment conserver le nom de la colonne d'origine
javadba
y a-t-il une liste quelque part des types de données de chaîne courte que Spark identifiera?
alfredox
1
cette solution fonctionne également à merveille en boucle, par exemplefrom pyspark.sql.types import IntegerType for ftr in ftr_list: df = df.withColumn(f, df[f].cast(IntegerType()))
Quetzalcoatl
11

Les réponses données sont suffisantes pour résoudre le problème, mais je souhaite partager une autre façon d'introduire la nouvelle version de Spark (je n'en suis pas sûr), donc la réponse donnée ne l'a pas attrapée.

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

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

version 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()
Cristian
la source
2

la solution était simple -

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