So ändern Sie eine Dataframe-Spalte in pyspark vom Typ "String" in den Typ "Double"

99

Ich habe einen Datenrahmen mit einer Spalte als String. Ich wollte den Spaltentyp in PySpark in Double-Typ ändern.

Folgendes habe ich getan:

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

Ich wollte nur wissen, ob dies der richtige Weg ist, da beim Durchlaufen der logistischen Regression ein Fehler auftritt. Ich frage mich, ob dies der Grund für die Probleme ist.

Abhishek Choudhary
quelle

Antworten:

167

Hier ist keine UDF erforderlich. Columnbietet bereits castMethode mit Instanz :DataType

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

Dabei stehen kanonische Zeichenfolgennamen (andere Variationen können ebenfalls unterstützt werden) dem simpleStringWert. 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>'
null323
quelle
2
Die Verwendung der colFunktion funktioniert auch. from pyspark.sql.functions import col, changedTypedf = joindf.withColumn("label", col("show").cast(DoubleType()))
Staza
Was sind die möglichen Werte des Argumentes cast () (die "String" -Syntax)?
Wirawan Purwanto
Ich kann nicht glauben, wie knapp das Spark-Dokument in der gültigen Zeichenfolge für den Datentyp war. Die nächstgelegene Referenz, die ich finden konnte, war folgende: docs.tibco.com/pub/sfire-analyst/7.7.1/doc/html/en-US/… .
Wirawan Purwanto
1
Wie konvertiere ich mehrere Spalten auf einmal?
Hui Chen
Wie ändere ich nullable in false?
Pitchblack408
48

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

changedTypedf = joindf.withColumn("show", joindf["show"].cast(DoubleType()))
Entlein
quelle
3
Danke Ich habe gesucht, wie ich den ursprünglichen Spaltennamen beibehalten kann
javadba
Gibt es irgendwo eine Liste der kurzen String-Datentypen, die Spark identifizieren wird?
Alfredox
1
Diese Lösung funktioniert auch hervorragend in einer Schleife, zBfrom pyspark.sql.types import IntegerType for ftr in ftr_list: df = df.withColumn(f, df[f].cast(IntegerType()))
Quetzalcoatl
10

Die gegebenen Antworten reichen aus, um das Problem zu lösen, aber ich möchte einen anderen Weg vorstellen, der möglicherweise in die neue Version von Spark eingeführt wird (da bin ich mir nicht sicher), sodass die gegebenen Antworten es nicht verstanden haben.

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

from pyspark.sql.functions import col , column
changedTypedf = joindf.withColumn("show", col("show").cast("double"))
Serkan Kucukbay
quelle
5

pyspark version:

  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
quelle
2

Die Lösung war einfach -

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