如何使用Spark SQL查询反转数组中的元素?

suzh9iv8  于 2023-01-13  发布在  Apache
关注(0)|答案(2)|浏览(181)

我有一个如下所示的数据输入数据键数据a [5,2,6,空,空] b [5,7,9,4,空,空,空]
我希望输出如下所示。输出:密钥数据a [6,2,5,空,空] B [4,9,7,5,空,空,空]
基本上,数组中的元素需要通过在末尾保留null来反转。有人能帮我做spark SQL查询吗?

soat7uwm

soat7uwm1#

我的方法-转换NULL进行排序,然后再转换回NULL

select transform(sort_array(transform(data, x -> coalesce(x, 0)), False), x -> case when x=0 then null else x end) from table1

[编辑]
刚刚注意到,如果NULL在末尾按逆序排序,则不需要转换。sort_array()将自行工作

sort_array(data, False)

[EDIT 2]
有人向我指出,我误解了这个问题,我相信这将工作...这是一个有点错综复杂,但是:

select 
 concat( 
    reverse(array_except(array(5,7,9,4,null,null,null), array(null))) 
  , array_repeat(null
    , aggregate(
        transform(array(5,7,9,4,null,null,null), (x, i) -> (case when x is null then 1 else 0 end))
        , 0, (acc, x) -> acc + x
       )
     )
 )

该方法计算空值的数量,删除空值,反转数组并在数组末尾添加空值

ubby3x7f

ubby3x7f2#

未测试:

reverse(filter(array(0, null, 2, 3, null), x -> x IS NOT NULL))

然后附加:

filter(array(0, null, 2, 3, null), x -> x IS NULL)

参见过滤器

相关问题