我有一个列为String的 Dataframe 。我想在PySpark中将列类型更改为Double类型。再往下是一句,何月道:
toDoublefunc = UserDefinedFunction(lambda x: x,DoubleType()) changedTypedf = joindf.withColumn("label",toDoublefunc(joindf['show']))
只是想知道,这是正确的方法,因为在运行逻辑回归时,我得到了一些错误,所以我想知道,这是麻烦的原因。
myzjeezk1#
这里不需要UDF。Column已经提供了cast方法和DataType* 示例 *:
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值。因此,对于原子类型:第一次例如复杂类型第一个
simpleString
bwleehnv2#
通过使用与输入列相同的名称,保留列的名称并避免添加额外的列:
from pyspark.sql.types import DoubleType changedTypedf = joindf.withColumn("show", joindf["show"].cast(DoubleType()))
31moq8wy3#
给出的答案足以处理这个问题,但我想分享另一种可能引入新版Spark * 的方式(我不确定)*,所以给出的答案没有抓住它。我们可以在spark语句中用关键字col("colum_name")到达该列:
col("colum_name")
from pyspark.sql.functions import col changedTypedf = joindf.withColumn("show", col("show").cast("double"))
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()
anhgbhbe5#
解决办法很简单
toDoublefunc = UserDefinedFunction(lambda x: float(x),DoubleType()) changedTypedf = joindf.withColumn("label",toDoublefunc(joindf['show']))
epggiuax6#
其他答案中的一个问题(取决于您的Pyspark版本)是withColumn的使用。至少在v2.4.4中观察到了性能问题(请参阅thread)。spark文档提到了关于withColumn的这一点:此方法在内部引入了一个投影。2因此,多次调用它(例如,通过循环来添加多个列)可能会生成大型计划,这可能会导致性能问题,甚至StackOverflowException。3为避免此问题,请一次对多个列使用select。一般而言,实现select的建议用法的一种方法是:
withColumn
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()) )
6条答案
按热度按时间myzjeezk1#
这里不需要UDF。
Column
已经提供了cast
方法和DataType
* 示例 *:或短字符串:
其中规范字符串名称(也可以支持其他变体)对应于
simpleString
值。因此,对于原子类型:第一次
例如复杂类型
第一个
bwleehnv2#
通过使用与输入列相同的名称,保留列的名称并避免添加额外的列:
31moq8wy3#
给出的答案足以处理这个问题,但我想分享另一种可能引入新版Spark * 的方式(我不确定)*,所以给出的答案没有抓住它。
我们可以在spark语句中用关键字
col("colum_name")
到达该列:wz8daaqr4#
PySpark版本:
anhgbhbe5#
解决办法很简单
epggiuax6#
其他答案中的一个问题(取决于您的Pyspark版本)是
withColumn
的使用。至少在v2.4.4中观察到了性能问题(请参阅thread)。spark文档提到了关于withColumn
的这一点:此方法在内部引入了一个投影。2因此,多次调用它(例如,通过循环来添加多个列)可能会生成大型计划,这可能会导致性能问题,甚至StackOverflowException。3为避免此问题,请一次对多个列使用select。
一般而言,实现
select
的建议用法的一种方法是: