更改 DataFrame 中的列数据类型并将其传递到 UDF - PySpark

Posted

技术标签:

【中文标题】更改 DataFrame 中的列数据类型并将其传递到 UDF - PySpark【英文标题】:Changing Columns DataTypes in a DataFrame and pass it into a UDF - PySpark 【发布时间】:2018-05-24 11:58:26 【问题描述】:

我目前正在解决一个问题,该问题涉及更改 DataFrame 中多个 Columns 的类型,但我不确定如何将其传递给 udf,因为我创建的函数需要dictionary 作为参数,因此,我不知道如何将函数传递给 udf

我目前拥有的所有数据类型都是String 类型,但正如我所提到的,我需要将它们更改为不同的类型,例如Integer & Date

我的函数看起来像这样:

def columns_types_transformer(df, reformating_dict):
    for column, new_type in reformating_dict.items():
        df = df.withColumn(column, df[column].cast(new_type))
    return df

我要传递的字典是这样的:

dictionary = 'date1': DateType(), 'date2': DateType(), 'date3': DateType(), 'date4': DateType(), 'date5': DateType(), 'date6': DateType(), 'integer1': IntegerType()

我的问题是如何将具有正确类型的字典传递给 udf? 我正在考虑的另一种方法是使用 SQLTransformer,但也不确定如何做到这一点。

任何帮助将不胜感激。

【问题讨论】:

我想知道你为什么需要一个UDF?您的代码应该可以正常工作,以便更改列的 dtypes。 @pansen 我想要一个 udf 以便将此 udf 放入管道中,因为仅使用此函数无法进入管道我实际上设法使用 SQLTransformer 找到解决方法 对,这是有道理的。感谢您分享您的答案。 【参考方案1】:

我设法使用 SQLTransformer 解决了这个问题。

这就是我所做的

sqlTrans_formatter = SQLTransformer(statement="SELECT CAST(date1 AS date), CAST(date2 AS date), CAST(date3 AS date), CAST(date4 AS date), CAST(date5 AS date), CAST(date6 AS date), CAST(integer1 AS int) FROM __THIS__")

df = sqlTrans_formatter.transform(ddf)

希望它对其他人也有帮助。

【讨论】:

以上是关于更改 DataFrame 中的列数据类型并将其传递到 UDF - PySpark的主要内容,如果未能解决你的问题,请参考以下文章

将 Spark Dataframe 中的多个列发送到外部 API 并将结果存储在单独的列中

Oracle过程增加字符串数据类型并将其存储为表中的列之一

Pandas:DataFrame数据的更改插入新增的列和行

更改熊猫中的列类型

更改熊猫中的列类型

删除强类型数据集中的列时出错?