pyspark UDF带有空值检查和if语句
如果传递给pyspark UDF的数组中不存在空值,则可以这样做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
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检查编辑。逻辑总是一样的。