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

dba5bblo  于 2022-11-21  发布在  Spark
关注(0)|答案(6)|浏览(450)

我有一个列为String的 Dataframe 。我想在PySpark中将列类型更改为Double类型。
再往下是一句,何月道:

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

只是想知道,这是正确的方法,因为在运行逻辑回归时,我得到了一些错误,所以我想知道,这是麻烦的原因。

myzjeezk

myzjeezk1#

这里不需要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值。因此,对于原子类型:
第一次
例如复杂类型
第一个

bwleehnv

bwleehnv2#

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

from pyspark.sql.types import DoubleType
changedTypedf = joindf.withColumn("show", joindf["show"].cast(DoubleType()))
31moq8wy

31moq8wy3#

给出的答案足以处理这个问题,但我想分享另一种可能引入新版Spark * 的方式(我不确定)*,所以给出的答案没有抓住它。
我们可以在spark语句中用关键字col("colum_name")到达该列:

from pyspark.sql.functions import col
changedTypedf = joindf.withColumn("show", col("show").cast("double"))
wz8daaqr

wz8daaqr4#

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

anhgbhbe5#

解决办法很简单

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

epggiuax6#

其他答案中的一个问题(取决于您的Pyspark版本)是withColumn的使用。至少在v2.4.4中观察到了性能问题(请参阅thread)。spark文档提到了关于withColumn的这一点:
此方法在内部引入了一个投影。2因此,多次调用它(例如,通过循环来添加多个列)可能会生成大型计划,这可能会导致性能问题,甚至StackOverflowException。3为避免此问题,请一次对多个列使用select。
一般而言,实现select的建议用法的一种方法是:

from pyspark.sql.types import *
from pyspark.sql import functions as F

cols_to_fix = ['show']
other_cols = [col for col in joindf.columns if not col in cols_to_fix]
joindf = joindf.select(
    *other_cols,
    F.col('show').cast(DoubleType())
)

相关问题