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.