Apache spark 如何使用array_remove Spark SQL内置函数删除空值

Apache spark 如何使用array_remove Spark SQL内置函数删除空值,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,Spark 2.4引入了新的有用的涉及数组的Spark SQL函数,但当我发现以下结果时,我有点困惑: select array\u remove(数组(1,2,3,null,3),null)是null而不是[1,2,3,3]。 这是预期的行为吗?是否可以使用array\u remove删除空值 作为旁注,目前我使用的替代方案是databricks中的高阶函数: 选择过滤器(数组(1,2,3,null,3),x->x不为null) 数组\移除(数组,T):数组 从给定数组中删除与给定元素相等的所

Spark 2.4引入了新的有用的涉及数组的Spark SQL函数,但当我发现以下结果时,我有点困惑:
select array\u remove(数组(1,2,3,null,3),null)
null
而不是
[1,2,3,3]。

这是预期的行为吗?是否可以使用
array\u remove
删除空值

作为旁注,目前我使用的替代方案是databricks中的高阶函数:

选择过滤器(数组(1,2,3,null,3),x->x不为null)

数组\移除(数组,T):数组 从给定数组中删除与给定元素相等的所有元素

注:我只参考了文件,他们采用了相同的数据。
**null永远不能等于null。

您可以在Spark 2中执行类似操作:

import org.apache.spark.sql.functions._
import org.apache.spark.sql._

/**
  * Array without nulls
  * For complex types, you are responsible for passing in a nullPlaceholder of the same type as elements in the array
  */
def non_null_array(columns: Seq[Column], nullPlaceholder: Any = "רכוב כל יום"): Column =
  array_remove(array(columns.map(c => coalesce(c, lit(nullPlaceholder))): _*), nullPlaceholder)
在Spark 3中,有一个新功能,您可以执行以下操作:

df.select(filter(col("array_column"), x => x.isNotNull))

回答第一个问题,这是一种预期行为吗,对因为官方笔记本()指出“从给定数组中删除与给定元素相等的所有元素。”
NULL
对应于未定义的值&结果也不会定义

因此,我认为
NULL
s不属于此函数的权限


为了更好地解决这个问题,您还可以使用
spark.sql(““选择数组”(数组(1,2,3,3,null,3,3,4,5),数组(null))”)”)。show()
但缺点是结果不会重复。

虽然不是一个很好的解决方案,但它可能会有所帮助

@F.udf("array<string>")
def udf_remove_nulls(arr):
    return [i for i in arr if i is not None]

df = df.withColumn("col_wo_nulls", udf_remove_nulls(df["array_column"]))
@F.udf(“数组”)
定义自定义项删除空值(arr):
return[如果我不是空的话,我在arr中代表我]
df=df.withColumn(“列为空”,自定义项为空,删除为空(df[“数组为列”))

另一种选择是前进的道路
array\u remove
取决于相等的概念,以及。