Как изменить столбец Dataframe от типа String до Double type в pyspark
У меня есть датафрейм с колонкой как String. Я хотел изменить тип столбца на тип Double в PySpark.
Вот как я это сделал:
toDoublefunc = UserDefinedFunction(lambda x: x,DoubleType())
changedTypedf = joindf.withColumn("label",toDoublefunc(joindf['show']))
Просто хотел знать, это правильный способ сделать это, так как во время прохождения Логистической регрессии я получаю какую-то ошибку, поэтому мне интересно, не в этом ли причина проблемы.
Ответы
Ответ 1
Здесь нет необходимости в 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
Сохраните имя столбца и избегайте добавления дополнительных столбцов, используя то же имя, что и входной столбец:
changedTypedf = joindf.withColumn("show", joindf["show"].cast(DoubleType()))
Ответ 3
Данных ответов достаточно, чтобы решить проблему, но я хочу поделиться другим способом, который может быть представлен новой версией Spark (я не уверен в этом), поэтому данный ответ не уловил ее.
Мы можем достичь столбца в операторе spark с ключевым словом col("colum_name")
:
from pyspark.sql.functions import col , column
changedTypedf = joindf.withColumn("show", col("show").cast("double"))
Ответ 4
решение было простым -
toDoublefunc = UserDefinedFunction(lambda x: float(x),DoubleType())
changedTypedf = joindf.withColumn("label",toDoublefunc(joindf['show']))
Ответ 5
Вы можете попробовать это:
changedTypedf = joindf.select(joindf.show.cast("float"))
С помощью вышеприведенного оператора в dataframe changeTypedf будет только показывать столбец, чтобы добавить дополнительные поля из joindf в changeTypedf, вот синтаксис:
changedTypedf = joindf.select(joindf.show.cast("float"),joindf.column2)
Ответ 6
версия 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()