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.

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

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()))

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"))

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()

2

la solution était simple -

toDoublefunc = UserDefinedFunction(lambda x: float(x),DoubleType())
changedTypedf = joindf.withColumn("label",toDoublefunc(joindf['show']))
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.