как изменить столбец Dataframe с типа String на тип Double в pyspark

102

У меня есть dataframe со столбцом как String. Я хотел изменить тип столбца на тип Double в PySpark.

Я сделал следующее:

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

Просто хотел знать, правильный ли это способ сделать это, поскольку при выполнении логистической регрессии я получаю некоторую ошибку, поэтому мне интересно, является ли это причиной проблемы.

Абхишек Чоудхари
источник

Ответы:

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>'
ноль323
источник
2
Использование colфункции также работает. from pyspark.sql.functions import col, changedTypedf = joindf.withColumn("label", col("show").cast(DoubleType()))
Staza 03
Каковы возможные значения аргумента cast () (синтаксис «строка»)?
Wirawan Purwanto
Я не могу поверить, насколько кратким был документ Spark в допустимой строке для типа данных. Ближайшая ссылка, которую я смог найти, была следующая : docs.tibco.com/pub/sfire-analyst/7.7.1/doc/html/en-US/… .
Wirawan Purwanto
1
Как преобразовать несколько столбцов за один раз?
hui chen
Как изменить значение nullable на false?
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']))
Абхишек Чоудхари
источник