pyspark'ta bir Dataframe sütunu String türünden Double type'a nasıl değiştirilir


102

String olarak sütun içeren bir veri çerçevem ​​var. PySpark'ta sütun türünü Çift tip olarak değiştirmek istedim.

Yolu takip ettim:

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

Sadece bilmek istedim, Lojistik Regresyondan geçerken bunu yapmanın doğru yolu bu mu, biraz hata alıyorum, bu yüzden merak ediyorum, sorunun nedeni bu mu?

Yanıtlar:


183

Burada UDF'ye gerek yok. Columnzaten örnek ile castyöntem sağlar :DataType

from pyspark.sql.types import DoubleType

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

veya kısa dize:

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

burada kurallı dize adları (diğer varyasyonlar da desteklenebilir) simpleStringdeğere karşılık gelir . Yani atomik türler için:

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

ve örneğin karmaşık türler

types.ArrayType(types.IntegerType()).simpleString()   
'array<int>'
types.MapType(types.StringType(), types.IntegerType()).simpleString()
'map<string,int>'

2
colFonksiyonu kullanmak da işe yarar. from pyspark.sql.functions import col, changedTypedf = joindf.withColumn("label", col("show").cast(DoubleType()))
Staza

Cast () bağımsız değişkeninin ("dize" sözdizimi) olası değerleri nelerdir?
Wirawan Purwanto

Spark belgesinin veri türü için geçerli dizede ne kadar kısa olduğuna inanamıyorum. Bulabildiğim en yakın referans şuydu : docs.tibco.com/pub/sfire-analyst/7.7.1/doc/html/en-US/… .
Wirawan Purwanto

1
Tek seferde birden çok sütun nasıl dönüştürülür?
hui chen

Nullable'ı false olarak nasıl değiştirebilirim?
pitchblack408

53

Sütunun adını koruyun ve giriş sütunuyla aynı adı kullanarak fazladan sütun eklemekten kaçının:

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

3
Teşekkürler Orijinal sütun adını nasıl koruyacağımı arıyordum
StephenBoesch

Spark'ın tanımlayacağı kısa dize veri türlerinin bir yerinde bir liste var mı?
alfredox

1
bu çözüm aynı zamanda bir döngüde de muhteşem bir şekilde çalışıyor, örneğinfrom pyspark.sql.types import IntegerType for ftr in ftr_list: df = df.withColumn(f, df[f].cast(IntegerType()))
Quetzalcoatl

11

Verilen cevaplar problemin üstesinden gelmek için yeterlidir, ancak Spark'ın yeni versiyonunu tanıtabilecek başka bir yolu paylaşmak istiyorum (bundan emin değilim) bu yüzden verilen cevap onu yakalamadı.

Spark deyimindeki sütuna col("colum_name")anahtar kelime ile ulaşabiliriz :

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

5

pyspark versiyonu:

  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

çözüm basitti -

toDoublefunc = UserDefinedFunction(lambda x: float(x),DoubleType())
changedTypedf = joindf.withColumn("label",toDoublefunc(joindf['show']))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.