pyspark - 带有空值检查和 if 语句的 pyspark UDF
问题描述
如果传递给 pyspark UDF 的数组中不存在空值,则此方法有效。
concat_udf = udf(
lambda con_str, arr: [x + con_str for x in arr], ArrayType(StringType())
)
我没有看到我们如何通过使用 If 的 null / None 检查来调整它。如何在下面正确调整以下不起作用:
concat_udf = udf(lambda con_str, arr: [ if x is None: 'XXX' else: x + con_str for x in arr ], ArrayType(StringType()))
我找不到这样的例子。如果transform
也没有成功。
+----------+--------------+--------------------+
| name|knownLanguages| properties|
+----------+--------------+--------------------+
| James| [Java, Scala]|[eye -> brown, ha...|
| Michael|[Spark, Java,]|[eye ->, hair -> ...|
| Robert| [CSharp, ]|[eye -> , hair ->...|
|Washington| null| null|
| Jefferson| [1, 2]| []|
+----------+--------------+--------------------+
应该成为
+----------+--------------------+-----------------------+
| name|knownLanguages| properties |
+----------+--------------------+-----------------------+
| James| [JavaXXX, ScalaXXX]|[eye -> brown, ha... |
| Michael|[SparkXXX, JavaXXX,XXX]|[eye ->, hair -> ...|
| Robert| [CSharpXXX, XXX]|[eye -> , hair ->... |
|Washington| XXX| null |
| Jefferson| [1XXX, 2XXX]| [] |
+----------+--------------+-----------------------------+
解决方案
使用三元运算符,我会做这样的事情:
concat_udf = udf(
lambda con_str, arr: [x + con_str if x is not None else "XXX" for x in arr]
if arr is not None
else ["XXX"],
ArrayType(StringType()),
)
# OR
concat_udf = udf(
lambda con_str, arr: [
x + con_str if x is not None else "XXX" for x in arr or [None]
],
ArrayType(StringType()),
)
推荐阅读
- php - WooCommerce - 获取产品子类别
- np - NP、NP-Complete、NP-Hard 问题
- oracle - 按近似值划分
- laravel - 如何更改 Sentinel 记住我 cookie 的生命周期?
- ruby-on-rails - 时间数据类型上的时区未按预期工作-Rails 5
- angular - 如何在 Angular 6 中测试应用程序/根组件
- java - 在 Spring Boot 2 中记录正文的最有效方法是什么?
- python - 在函数中传递一个元组
- python - 如何在 Python 中提高不平衡数据集的精度和召回率
- typescript - Typescript 找不到在超类的类型定义中定义的方法。怎么了?