pyspark UDF带有空值检查和if语句

pyspark UDF带有空值检查和if语句,pyspark,Pyspark,如果传递给pyspark UDF的数组中不存在空值,则可以这样做 concat_udf=udf( lambda con_str,arr:[x+con_str代表arr中的x],数组类型(StringType()) ) 我看不出我们如何用带有If的null/None检查来适应这种情况。如何正确调整以下不起作用的选项: concat_udf = udf(lambda con_str, arr: [ if x is None: 'XXX' else: x + con_str for x in ar

如果传递给pyspark UDF的数组中不存在空值,则可以这样做

concat_udf=udf(
lambda con_str,arr:[x+con_str代表arr中的x],数组类型(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()))
我找不到这样的例子。如果使用
转换
也不成功

+----------+--------------+--------------------+
|      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,如果x不是arr中x的其他“XXX”]
如果arr不是None
else[“XXX”],
ArrayType(StringType()),
)
#或
concat_udf=udf(
lambda con_街,arr:[
如果x不是arr中x的非其他“XXX”或[无]
],
ArrayType(StringType()),
)

PythonException:从UDF引发异常:“TypeError:“NoneType”对象不可编辑“@thebluephantom哪一个应该是None?数组还是数组的内容?此错误表示
arr
为无。但是您在问题中的
x
上写了一个测试用例。缺少第二个上的其他测试用例。最后用pysparkEdited检查这个udf,这应该会澄清。@BluePhantom检查编辑。逻辑总是一样的。