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?.
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>'
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()))
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"))
la solution était simple -
toDoublefunc = UserDefinedFunction(lambda x: float(x),DoubleType())
changedTypedf = joindf.withColumn("label",toDoublefunc(joindf['show']))