我想在数据框列上运行自定义函数。该列有一个长字符串,其中包含一些“打开”或“单击”信息。字符串格式在“路径”列中是这样的:
+---------------------------------------------------------------+
| Path|
+---------------------------------------------------------------+
|/utility/tracking/opened/50DD3254-BA1D-4D0B-ADB5-6529E9C90982/0|
|/utility/tracking/tracking/ClickedUrl |
+---------------------------------------------------------------+
和源数据帧看起来像这样
现在,我在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
获取整数值几乎不需要帮助,如果我做错了任何事情,请提出建议,我们将不胜感激。预先感谢
答案 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
。