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.

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

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

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

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

2

solusinya sederhana -

toDoublefunc = UserDefinedFunction(lambda x: float(x),DoubleType())
changedTypedf = joindf.withColumn("label",toDoublefunc(joindf['show']))
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.