栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

数据框上的Pyspark UDF列

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据框上的Pyspark UDF列

udf
没有的列名是什么知识。因此,它会检查
if
/
elif
块中的每个条件,并且所有条件的计算结果均为
False
。因此函数将返回
None

您必须将您的代码重写

udf
为要检查的列:

from pyspark.sql.functions import udffrom pyspark.sql.types import StringTypedef get_profile(foo, bar, baz):    if foo == 1:        return 'Foo'    elif bar == 1:        return 'Bar'    elif baz == 1 :        return 'Baz'spark_udf = udf(get_profile, StringType())spark_df = spark_df.withColumn('get_profile',spark_udf('Foo', 'Bar', 'Baz'))spark_df.show()#+---+---+---+-----------+#|Foo|Bar|Baz|get_profile|#+---+---+---+-----------+#|  0|  1|  0|        Bar|#|  1|  0|  0|        Foo|#|  1|  1|  1|        Foo|#+---+---+---+-----------+

如果您有很多列,并希望全部传递(按顺序):

spark_df = spark_df.withColumn('get_profile', spark_udf(*spark_df.columns))

更一般而言,您可以解压缩任何有序的列列表:

cols_to_pass_to_udf = ['Foo', 'Bar', 'Baz']spark_df = spark_df.withColumn('get_profile', spark_udf(*cols_to_pass_to_udf ))

但是此特定操作不需要

udf
。我会这样:

from pyspark.sql.functions import coalesce, when, col, litspark_df.withColumn(    "get_profile",    coalesce(*[when(col(c)==1, lit(c)) for c in spark_df.columns])).show()#+---+---+---+-----------+#|Foo|Bar|Baz|get_profile|#+---+---+---+-----------+#|  0|  1|  0|        Bar|#|  1|  0|  0|        Foo|#|  1|  1|  1|        Foo|#+---+---+---+-----------+

之所以

pyspark.sql.functions.when()
可行
null
,是因为如果条件求值
False
且未
otherwise
指定任何值,则默认情况下将返回。然后列表理解
pyspark.sql.functions.coalesce
将返回第一个非空列。

请注意,这仅等效于

udf
列的顺序与
get_profile
函数中评估的顺序相同的情况。更明确地说,您应该执行以下操作:

spark_df.withColumn(    "get_profile",    coalesce(*[when(col(c)==1, lit(c)) for c in ['Foo', 'Bar', 'Baz'])).show()


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/634224.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号