如何在pyspark中将Dataframe列从String类型更改为Double类型

时间:2015-08-29 09:34:09

标签: python apache-spark dataframe pyspark apache-spark-sql

我有一个数据框,其列为String。 我想在PySpark中将列类型更改为Double类型。

以下是我的方式:

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

只是想知道,这是在跑步时这样做的正确方法 通过Logistic回归,我收到了一些错误,所以我想, 这就是造成麻烦的原因。

5 个答案:

答案 0 :(得分:108)

这里不需要UDF。 Column已向cast method提供了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>'

答案 1 :(得分:38)

保留列的名称,并使用与输入列相同的名称来避免额外添加列:

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

答案 2 :(得分:4)

鉴于答案足以解决问题,但我想分享另一种方式可能会引入新版本的Spark (我不确定)所以给出的答案没有抓住它

我们可以使用col("colum_name")关键字:

到达spark语句中的列
from pyspark.sql.functions import col , column
changedTypedf = joindf.withColumn("show", col("show").cast("double"))

答案 3 :(得分:2)

解决方案很简单 -

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

答案 4 :(得分:0)

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()