як змінити стовпець Dataframe із типу String на тип Double у pyspark


99

У мене є фрейм даних із стовпцем як String. Я хотів змінити тип стовпця на Double type у PySpark.

Ось такий шлях я зробив:

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

Просто хотів знати, чи це правильний спосіб це зробити, оскільки під час проходження логістичної регресії я отримую деяку помилку, тому мені цікаво, чи це причина проблеми?

Відповіді:


171

Тут немає потреби в СДС. 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()))
Стаза

Які можливі значення аргументу cast () (синтаксис "рядок")?
Wirawan Purwanto

Я не можу повірити, наскільки стислий документ Spark був у дійсному рядку для типу даних. Найближче посилання, яке я міг знайти, було таке: docs.tibco.com/pub/sfire-analyst/7.7.1/doc/html/en-US/… .
Wirawan Purwanto

1
Як перетворити кілька стовпців за один раз?
хуй чень,

Як змінити значення nullable на false?
pitchblack408

50

Збережіть ім'я стовпця та уникайте зайвого додавання стовпця, використовуючи те саме ім'я, що і стовпець вводу:

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

3
Дякую, я шукав, як зберегти оригінальну назву стовпця
Джавадба

чи є десь перелік типів даних коротких рядків, які буде ідентифікувати Spark?
alfredox

1
це рішення також чудово працює у циклі, наприкладfrom pyspark.sql.types import IntegerType for ftr in ftr_list: df = df.withColumn(f, df[f].cast(IntegerType()))
Кетцалькоатль

11

Наданих відповідей достатньо для вирішення проблеми, але я хочу поділитися іншим способом, яким можна представити нову версію Spark (я не впевнений у цьому), тому дана відповідь не зрозуміла.

Ми можемо дістатись до стовпця у заяві 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']))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.