webentwicklung-frage-antwort-db.com.de

so ändern Sie eine Dataframe-Spalte von String-Typ in Double-Typ in Pyspark

Ich habe ein Dataframe mit Spalte als String . Ich wollte den Spaltentyp in PySpark in Double Type ändern.

Folgendes ist der Weg, den ich getan habe:

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

Ich wollte nur wissen, ist dies der richtige Weg, um es zu tun, während ich durch logistische Regression läuft. Ich bekomme einen Fehler, daher frage ich mich, dass dies der Grund für den Ärger ist.

49

Hier ist keine UDF erforderlich. Column bietet bereits cast-Methode mit DataType-Instanz:

from pyspark.sql.types import DoubleType

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

oder kurze Zeichenfolge:

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

wobei kanonische Zeichenfolgennamen (andere Variationen können ebenfalls unterstützt werden) dem simpleString-Wert entsprechen. Also für Atomtypen:

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

und zum Beispiel komplexe Typen

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

Behalten Sie den Namen der Spalte bei und vermeiden Sie das Hinzufügen zusätzlicher Spalten, indem Sie denselben Namen als Eingabespalte verwenden:

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

Die gegebenen Antworten reichen aus, um das Problem zu lösen. Ich möchte jedoch auf eine andere Art und Weise berichten, wie die neue Version von Spark eingeführt werden kann (ich bin mir nicht sicher).

Wir können die Spalte in der spark-Anweisung mit dem Schlüsselwort col("colum_name") erreichen:

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

die Lösung war einfach -

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