cách thay đổi cột Dataframe từ kiểu String thành Double type trong pyspark


99

Tôi có một khung dữ liệu với cột là Chuỗi. Tôi muốn thay đổi loại cột thành Loại kép trong PySpark.

Sau đây là cách, tôi đã làm:

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

Tôi chỉ muốn biết, đây có phải là cách đúng đắn để làm điều đó không vì trong khi chạy qua Logistic Regression, tôi gặp một số lỗi, vì vậy tôi tự hỏi, đây có phải là lý do gây ra sự cố không.

Câu trả lời:


171

Ở đây không cần UDF. Columnđã cung cấp castphương thức với phiên bản :DataType

from pyspark.sql.types import DoubleType

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

hoặc chuỗi ngắn:

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

trong đó tên chuỗi chuẩn (các biến thể khác cũng có thể được hỗ trợ) tương ứng với simpleStringgiá trị. Vì vậy, đối với các loại nguyên tử:

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

và ví dụ các loại phức tạp

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

2
Sử dụng colchức năng cũng hoạt động. from pyspark.sql.functions import col, changedTypedf = joindf.withColumn("label", col("show").cast(DoubleType()))
Staza

Các giá trị có thể có của đối số cast () (cú pháp "chuỗi") là gì?
Wirawan Purwanto

Tôi không thể tin được tài liệu Spark ngắn gọn như thế nào trên chuỗi hợp lệ cho kiểu dữ liệu. Tham khảo gần nhất mà tôi có thể tìm thấy là: docs.tibco.com/pub/sfire-analyst/7.7.1/doc/html/en-US/… .
Wirawan Purwanto

1
Làm thế nào để chuyển đổi nhiều cột trong một lần?
hui chen

Làm cách nào để thay đổi nullable thành false?
pitchblack408

50

Giữ nguyên tên của cột và tránh thêm cột thừa bằng cách sử dụng cùng tên với cột đầu vào:

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

3
Cảm ơn Tôi đang tìm cách giữ lại tên cột ban đầu
javadba

có một danh sách nào đó về các kiểu dữ liệu chuỗi ngắn mà Spark sẽ xác định không?
alfredox

1
giải pháp này cũng làm việc xuất sắc trong một vòng lặp ví dụfrom pyspark.sql.types import IntegerType for ftr in ftr_list: df = df.withColumn(f, df[f].cast(IntegerType()))
Quetzalcoatl

11

Các câu trả lời đưa ra là đủ để giải quyết vấn đề nhưng tôi muốn chia sẻ một cách khác có thể được giới thiệu phiên bản mới của Spark (tôi không chắc về nó) nên câu trả lời đã đưa ra đã không hiểu.

Chúng ta có thể đến cột trong câu lệnh spark với col("colum_name")từ khóa:

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

5

phiên bản 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

giải pháp rất đơn giản -

toDoublefunc = UserDefinedFunction(lambda x: float(x),DoubleType())
changedTypedf = joindf.withColumn("label",toDoublefunc(joindf['show']))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.