首页 > 解决方案 > 带有空值检查和 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]|                  []   |
+----------+--------------+-----------------------------+

标签: pyspark

解决方案


使用三元运算符,我会做这样的事情:

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()),
)

推荐阅读