jak zmienić kolumnę Dataframe z typu String na typ Double w pyspark

102

Mam ramkę danych z kolumną jako ciągiem. Chciałem zmienić typ kolumny na Double type w PySpark.

Oto droga, którą zrobiłem:

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

Chciałem tylko wiedzieć, czy to właściwy sposób, aby to zrobić, ponieważ podczas przechodzenia przez regresję logistyczną dostaję jakiś błąd, więc zastanawiam się, czy to jest przyczyna kłopotów.

Abhishek Choudhary
źródło

Odpowiedzi:

180

Nie ma tu potrzeby posiadania UDF. Columnjuż dostarcza castmetodę z instancją :DataType

from pyspark.sql.types import DoubleType

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

lub krótki ciąg:

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

gdzie kanoniczne nazwy ciągów (mogą być również obsługiwane inne odmiany) odpowiadają simpleStringwartości. Więc dla typów atomowych:

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

i na przykład typy złożone

types.ArrayType(types.IntegerType()).simpleString()   
'array<int>'
types.MapType(types.StringType(), types.IntegerType()).simpleString()
'map<string,int>'
zero323
źródło
2
Korzystanie z colfunkcji również działa. from pyspark.sql.functions import col, changedTypedf = joindf.withColumn("label", col("show").cast(DoubleType()))
Staza
Jakie są możliwe wartości argumentu cast () (składnia „string”)?
Wirawan Purwanto
Nie mogę uwierzyć, jak zwięzły dokument Spark był na prawidłowym ciągu dla typu danych. Najbliższe odniesienie, jakie udało mi się znaleźć, brzmiało: docs.tibco.com/pub/sfire-analyst/7.7.1/doc/html/en-US/… .
Wirawan Purwanto
1
Jak przekonwertować wiele kolumn za jednym razem?
hui chen
Jak zmienić wartość null na false?
pitchblack408
52

Zachowaj nazwę kolumny i unikaj dodawania dodatkowych kolumn, używając tej samej nazwy co kolumna wejściowa:

changedTypedf = joindf.withColumn("show", joindf["show"].cast(DoubleType()))
Kaczątko
źródło
3
Dzięki Szukałem, jak zachować oryginalną nazwę kolumny
javadba
czy jest gdzieś lista typów danych krótkich ciągów, które Spark zidentyfikuje?
alfredox
1
to rozwiązanie świetnie sprawdza się też w pętli np.from pyspark.sql.types import IntegerType for ftr in ftr_list: df = df.withColumn(f, df[f].cast(IntegerType()))
Quetzalcoatl
11

Podane odpowiedzi wystarczą, aby uporać się z problemem, ale chcę podzielić się innym sposobem, który może być wprowadzony w nowej wersji Sparka (nie jestem tego pewien) więc udzielona odpowiedź tego nie złapała.

Do kolumny w instrukcji spark docieramy ze col("colum_name")słowem kluczowym:

from pyspark.sql.functions import col , column
changedTypedf = joindf.withColumn("show", col("show").cast("double"))
serkan kucukbay
źródło
5

wersja pyspark:

  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
źródło
2

rozwiązanie było proste -

toDoublefunc = UserDefinedFunction(lambda x: float(x),DoubleType())
changedTypedf = joindf.withColumn("label",toDoublefunc(joindf['show']))
Abhishek Choudhary
źródło