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.

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

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

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

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

2

Die Lösung war einfach -

toDoublefunc = UserDefinedFunction(lambda x: float(x),DoubleType())
changedTypedf = joindf.withColumn("label",toDoublefunc(joindf['show']))
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.