pyspark apply函数在列上

2024-04-28 20:48:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在dataframe列上运行一个自定义函数。列有一个长字符串,其中包含一些打开或单击的信息。路径列中的字符串格式如下所示:

+---------------------------------------------------------------+               
|                                                           Path|
+---------------------------------------------------------------+
|/utility/tracking/opened/50DD3254-BA1D-4D0B-ADB5-6529E9C90982/0|
|/utility/tracking/tracking/ClickedUrl                          |
+---------------------------------------------------------------+

源数据帧看起来像这样

enter image description here

现在我正在运行pyspark UDF来应用于“path”列,它会在列中找到“opened”还是“clicked”,并给我一个新的dataframe,其中“path”列的值为10或20,其他值为null,具体取决于opened clicked或else条件

^{pr2}$

结果显示在“Path”列中为null,而不是值10或20

enter image description here

如果我做任何事情都不需要整数值的帮助,我会非常感激。提前谢谢


Tags: path函数字符串image信息dataframeheredescription
2条回答

您需要从函数返回值,而不是打印它们。像这样-

def clickopen(x):
    if 'opened' in x.lower().split('/'):
        return 10
    elif 'clickedurl' in x.lower().split('/'):
        return 20
    else:
        return None

我不知道如何在pySpark中返回null。在

正如其他人提到的,您的主要问题是打印值而不是返回值。然而,即使在修复之后,在这里使用udf也是非常低效的。在

相反,可以使用^{}^{}。在

尝试:

import pyspark.sql.functions as f

new_df = new_df.withColumn(
    "Path",
    f.when(
        f.lower(f.col("Path")).like(r"%opened%"),
        f.lit(10)
    ).when(
        f.lower(f.col("Path")).like(r"%clickedurl"),
        f.lit(20)
    )
)

默认情况下,when将返回null,如果没有任何条件匹配。在

相关问题 更多 >