วิธีเปลี่ยนคอลัมน์ Dataframe จาก String type เป็น Double type ใน pyspark


102

ฉันมี dataframe ที่มีคอลัมน์เป็น String ฉันต้องการเปลี่ยนประเภทคอลัมน์เป็นประเภท Double ใน PySpark

ต่อไปนี้เป็นวิธีที่ฉันทำ:

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

แค่อยากรู้ว่านี่เป็นวิธีที่ถูกต้องหรือไม่ในขณะที่ทำงานผ่าน Logistic Regression ฉันได้รับข้อผิดพลาดบางอย่างดังนั้นฉันจึงสงสัยว่านี่เป็นสาเหตุของปัญหาหรือไม่

คำตอบ:


181

ที่นี่ไม่จำเป็นต้องมี UDF Columnมีcastวิธีการกับอินสแตนซ์แล้ว :DataType

from pyspark.sql.types import DoubleType

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

หรือสตริงสั้น:

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

โดยที่ชื่อสตริงมาตรฐาน (สามารถรองรับรูปแบบอื่น ๆ ได้เช่นกัน) สอดคล้องกับsimpleStringค่า ดังนั้นสำหรับประเภทอะตอม:

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

และตัวอย่างเช่นประเภทที่ซับซ้อน

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

2
การใช้colฟังก์ชันก็ใช้ได้เช่นกัน from pyspark.sql.functions import col, changedTypedf = joindf.withColumn("label", col("show").cast(DoubleType()))
Staza

ค่าที่เป็นไปได้ของอาร์กิวเมนต์ cast () (ไวยากรณ์ "string") คืออะไร
Wirawan Purwanto

ฉันไม่อยากจะเชื่อเลยว่า terse Spark doc อยู่บนสตริงที่ถูกต้องสำหรับประเภทข้อมูลได้อย่างไร การอ้างอิงที่ใกล้เคียงที่สุดที่ฉันสามารถหาเป็นแบบนี้: docs.tibco.com/pub/sfire-analyst/7.7.1/doc/html/en-US/...
Wirawan Purwanto

1
วิธีการแปลงหลายคอลัมน์ในครั้งเดียว?
hui chen

ฉันจะเปลี่ยนโมฆะเป็นเท็จได้อย่างไร
pitchblack408

52

รักษาชื่อของคอลัมน์และหลีกเลี่ยงการเพิ่มคอลัมน์เพิ่มเติมโดยใช้ชื่อเดียวกับคอลัมน์อินพุต:

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

3
ขอบคุณฉันกำลังมองหาวิธีรักษาชื่อคอลัมน์เดิม
StephenBoesch

มีรายการประเภทข้อมูลสตริงสั้นที่ Spark จะระบุหรือไม่?
alfredox

1
โซลูชันนี้ยังทำงานได้อย่างยอดเยี่ยมในการวนซ้ำเช่นfrom pyspark.sql.types import IntegerType for ftr in ftr_list: df = df.withColumn(f, df[f].cast(IntegerType()))
Quetzalcoatl

11

คำตอบที่ได้รับเพียงพอที่จะจัดการกับปัญหา แต่ฉันต้องการแบ่งปันวิธีอื่นซึ่งอาจมีการเปิดตัว Spark เวอร์ชันใหม่(ฉันไม่แน่ใจเกี่ยวกับเรื่องนี้)ดังนั้นคำตอบที่ได้รับจึงไม่เข้าใจ

เราสามารถเข้าถึงคอลัมน์ในคำสั่งจุดประกายด้วยcol("colum_name")คำสำคัญ:

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

5

รุ่น 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

วิธีแก้ปัญหานั้นง่ายมาก -

toDoublefunc = UserDefinedFunction(lambda x: float(x),DoubleType())
changedTypedf = joindf.withColumn("label",toDoublefunc(joindf['show']))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.