将函数映射到 pyspark 数据框的多列

Posted

技术标签:

【中文标题】将函数映射到 pyspark 数据框的多列【英文标题】:Mapping a function to multiple columns of pyspark dataframe 【发布时间】:2021-09-06 07:34:54 【问题描述】:

我有一个 pyspark df,它有很多列,但一个子集如下所示:

datetime eventid sessionid lat lon filtertype
someval someval someval someval someval someval
someval someval someval someval someval someval

我想映射一个函数 some_func(),它只使用“lat”、“lon”和“event_id”列来返回一个布尔值,该值将作为名为“已验证”的单独列添加到 df .基本上我需要分别检索函数内感兴趣的列并对它们进行操作。 我知道我可以使用 UDF 或 df.withColumn() 但它们用于映射到单列。为此,我需要将感兴趣的列连接为一列,这会使代码有点混乱。

有没有办法单独检索函数内的列值并将该函数映射到整个数据框? (类似于我们可以使用 map-lambda 和 df.apply() 对 Pandas df 执行的操作)?

【问题讨论】:

这能回答你的问题吗? Pyspark: Pass multiple columns in UDF 【参考方案1】:

您可以创建一个可以占用多列作为参数的udf

例如:

from pyspark.sql.functions as f
from pyspark.sql.types import BooleanType

def your_function(p1, p2, p3):
    # your logic goes here
    # return a bool

udf_func = f.udf(your_function, BooleanType())


df = spark.read.....

df2 = df.withColumn("verified", udf_func(f.col("lat"), f.col("lon"), f.col("event_id")))

df2.show(truncate=False)

【讨论】:

以上是关于将函数映射到 pyspark 数据框的多列的主要内容,如果未能解决你的问题,请参考以下文章

PySpark 函数基于多列数据框创建自定义输出

在 PySpark 中使用 rdd.map 解压和编码字符串

将json行数据划分为pandas数据框的多列[重复]

Pyspark - 将多列数据组合成跨行分布的单列[重复]

Pyspark 数据框将多列转换为浮点数

如何在过滤器和 lambda 函数 pyspark 中使用多列