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)
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)
5条答案
按热度按时间ffx8fchx1#
要回答你的第一个问题,这是一个预期的行为吗?,是的.因为官方笔记本(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()
,但缺点是结果将没有重复。5t7ly7z52#
你可以在Spark 2中这样做:
在Spark 3中,有新的数组过滤功能,您可以:
zlhcx6iw3#
https://docs.databricks.com/_static/notebooks/apache-spark-2.4-functions.html
数组移除(数组,T):从给定数组中删除所有等于给定元素的元素。
注意:我只是参考了文档,他们采用了相同的数据。**null永远不能等于null。
hwazgwia4#
我不认为你可以使用array_remove()或array_except()来解决你的问题。然而,尽管这不是一个很好的解决方案,但它可能会有所帮助。
4nkexdtk5#
如果您还想去除重复项,并只返回一次每个不同的非NULL值,则可以使用
array_except
:或者类似的SQL,如下所示: