Spark 2.4引入了新的有用的涉及数组的Spark SQL函数,但是当我发现以下结果时,我有些困惑:
select array_remove(array(1, 2, 3, null, 3), null)
是null
,而不是[1, 2, 3, 3].
这是预期的行为吗?可以使用array_remove
删除空值吗?
请注意,目前我使用的替代方法是数据块中的高阶函数:
select filter(array(1, 2, 3, null, 3), x -> x is not null)
答案 0 :(得分:4)
要回答第一个问题,这是预期的行为吗? ,是的。因为官方笔记本(https://docs.databricks.com/_static/notebooks/apache-spark-2.4-functions.html)指出“从给定数组中删除等于给定元素的所有元素。”和
NULL
对应于未定义的值,结果也不会定义。
因此,我认为NULL
不在此功能的范围内。
更好地找到了一种解决方法,您也可以使用spark.sql("""SELECT array_except(array(1, 2, 3, 3, null, 3, 3,3, 4, 5), array(null))""").show()
,但缺点是结果将不会重复。
答案 1 :(得分:3)
您可以执行以下操作:
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)
答案 2 :(得分:1)
https://docs.databricks.com/_static/notebooks/apache-spark-2.4-functions.html
array_remove(array,T):数组 从给定数组中删除所有与给定元素相等的元素。
注意:我只引用了文档,并且他们采用了相同的数据。 ** null永远不能等于null。
答案 3 :(得分:0)
我认为您不能使用 array_remove() 或 array_except() 来解决您的问题。然而,虽然这不是一个很好的解决方案,但它可能会有所帮助。
<ul>
<li class="item one"></li>
<li class="item two"></li>
<li class="item three"></li>
<li class="item four"></li>
<li class="item five"></li>
</ul>