it-swarm.com.ru

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

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

Вот как я это сделал:

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

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

49
Abhishek Choudhary

Здесь нет необходимости в 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>'
93
zero323

Сохраните имя столбца и избегайте добавления дополнительного столбца, используя то же имя, что и входной столбец:

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

Данных ответов достаточно, чтобы решить проблему, но я хочу поделиться другим способом, который может быть представлен новой версией Spark (я не уверен в этом) поэтому данный ответ не уловил ее.

Мы можем добраться до столбца в операторе spark с ключевым словом col("colum_name"):

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

решение было простым -

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