Presto:如何映射不同长度的数组?

问题描述 投票:0回答:1

假设我有数组

['1', '2', '3']
['a', 'b', 'c', 'd']
,我想映射它们

select map(array ['1', '2', '3'], array ['a', 'b', 'c', 'd'])

这将返回一个错误,指出数组需要具有相同的长度。

我怎样才能复制Python的

zip()
,它会丢弃那些没有成对的东西?或者如果没有,用 NULL 填充缺失的部分?

sql presto trino
1个回答
3
投票

您可以使用

slice
cardinality
来“固定”尺寸:

WITH dataset AS (
  SELECT * 
  FROM 
    (
      VALUES 
        (ARRAY [1, 2, 3], ARRAY[1, 2, 3, 4])
    ) AS t (arr1, arr2)
) 

SELECT 
  map (
    slice(arr1, 1, m), 
    slice(arr2, 1, m)
  ) 
FROM 
  (
    SELECT *, LEAST(cardinality(arr1), cardinality(arr2)) as m 
    FROM 
      dataset
  )

输出:

_col0
{1=1, 2=2, 3=3}

或者只是使用

zip
并将
ROW
的结果数组转换为映射(注意,这依赖于
ROW
元素的默认命名约定,正如 @Martin Traverso 在 Trino 的注释中指出的那样,您可以通过索引访问行字段,因此您可以将相应的行更改为
r -> r[1] IS NOT NULL
):

WITH dataset AS (
    SELECT * FROM (VALUES   
       (ARRAY [1,2,3], ARRAY[1,2,3,4])
 ) AS t (arr1, arr2))

SELECT map_from_entries(filter(zip(arr1, arr2), r -> r.field0 is not NULL))
FROM dataset

输出:

_col0
{1=1, 2=2, 3=3}
© www.soinside.com 2019 - 2024. All rights reserved.