bagaimana mengubah kolom Dataframe dari tipe String ke tipe Double di pyspark

103

Saya memiliki dataframe dengan kolom sebagai String. Saya ingin mengubah tipe kolom menjadi tipe Double di PySpark.

Berikut caranya, saya lakukan:

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

Hanya ingin tahu, apakah ini cara yang tepat untuk melakukannya karena saat menjalankan Regresi Logistik, saya mendapatkan beberapa kesalahan, jadi saya bertanya-tanya, apakah ini alasan masalah.

Abhishek Choudhary
sumber

Jawaban:

184

Tidak perlu UDF di sini. Columnsudah menyediakan castmetode dengan contoh :DataType

from pyspark.sql.types import DoubleType

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

atau string pendek:

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

di mana nama string kanonik (variasi lain juga dapat didukung) sesuai dengan simpleStringnilai. Jadi untuk tipe atom:

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

dan misalnya tipe kompleks

types.ArrayType(types.IntegerType()).simpleString()   
'array<int>'
types.MapType(types.StringType(), types.IntegerType()).simpleString()
'map<string,int>'
nol323
sumber
2
Menggunakan colfungsi tersebut juga berfungsi. from pyspark.sql.functions import col, changedTypedf = joindf.withColumn("label", col("show").cast(DoubleType()))
Staza
Apa kemungkinan nilai dari argumen cast () (sintaks "string")?
Wirawan Purwanto
Saya tidak percaya betapa singkatnya dokumen Spark pada string yang valid untuk tipe data. Referensi terdekat yang bisa saya temukan adalah ini: docs.tibco.com/pub/sfire-analyst/7.7.1/doc/html/en-US/… .
Wirawan Purwanto
1
Bagaimana cara mengonversi beberapa kolom sekaligus?
hui chen
Bagaimana cara mengubah nullable menjadi false?
pitchblack408
53

Pertahankan nama kolom dan hindari penambahan kolom tambahan dengan menggunakan nama yang sama sebagai kolom input:

changedTypedf = joindf.withColumn("show", joindf["show"].cast(DoubleType()))
Anak itik
sumber
3
Terima kasih Saya sedang mencari cara untuk mempertahankan nama kolom asli
StephenBoesch
apakah ada daftar di suatu tempat dari tipe data string pendek yang akan diidentifikasi oleh Spark?
alfredox
1
solusi ini juga bekerja dengan sangat baik dalam satu putaran misalnyafrom pyspark.sql.types import IntegerType for ftr in ftr_list: df = df.withColumn(f, df[f].cast(IntegerType()))
Quetzalcoatl
11

Jawaban yang diberikan sudah cukup untuk mengatasi masalah tetapi saya ingin berbagi cara lain yang mungkin memperkenalkan versi baru Spark (saya tidak yakin tentang itu) jadi jawaban yang diberikan tidak menangkapnya.

Kita bisa mencapai kolom di pernyataan percikan dengan col("colum_name")kata kunci:

from pyspark.sql.functions import col , column
changedTypedf = joindf.withColumn("show", col("show").cast("double"))
serkan kucukbay
sumber
5

versi 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
sumber
2

solusinya sederhana -

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