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.
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>'
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()))
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"))
die Lösung war einfach -
toDoublefunc = UserDefinedFunction(lambda x: float(x),DoubleType())
changedTypedf = joindf.withColumn("label",toDoublefunc(joindf['show']))