pyspark在列

时间:2018-08-24 09:16:22

标签: python apache-spark pyspark apache-spark-sql user-defined-functions

我想在数据框列上运行自定义函数。该列有一个长字符串,其中包含一些“打开”或“单击”信息。字符串格式在“路径”列中是这样的:

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

和源数据帧看起来像这样

enter image description here

现在,我在pyspark UDF之后运行以应用于“路径”列,该列查找该列中的“打开”还是“单击”,并为我提供带有“路径”列的新数据框,其值是10或20,否则取决于null打开点击或其他条件

def clickopen(x):
    if 'opened' in x.lower().split('/'):
        print(10)
    elif 'clickedurl' in x.lower().split('/'):
        print(20)
    else:
        print('null')
hunter = udf(clickopen)  
new_df = new_df.withColumn("Path", hunter("Path"))
new_df.show(n=20)

结果显示,“路径”列中的结果为空,而不是值10或20

enter image description here

获取整数值几乎不需要帮助,如果我做错了任何事情,请提出建议,我们将不胜感激。预先感谢

2 个答案:

答案 0 :(得分:0)

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

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

我不确定如何在pySpark中返回null。

答案 1 :(得分:0)

正如其他人所提到的,您的主要问题是您正在打印该值而不是返回它。但是,即使在修复之后,在此处使用udf的效率也很低。

您可以使用pyspark.sql.functions.when()pyspark.sql.Column.like()

尝试:

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