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.

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

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

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

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

2

rozwiązanie było proste -

toDoublefunc = UserDefinedFunction(lambda x: float(x),DoubleType())
changedTypedf = joindf.withColumn("label",toDoublefunc(joindf['show']))
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.