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

Presto: How to map arrays of different length?

假设我有数组 ['1', '2', '3']['a', 'b', 'c', 'd'],我想映射它们

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

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

我怎样才能复制 python 的 zip() 掉落没有一对的?或者,如果没有,用 NULL 填充缺失的部分?

您可以使用 slicecardinality 来“固定”尺寸:

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}