【问题标题】:Presto: How to map arrays of different length?Presto:如何映射不同长度的数组?
【发布时间】:2021-10-09 17:14:05
【问题描述】:

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

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

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

如何复制 python 的zip(),它会丢弃没有配对的那些?或者如果没有,用 NULL 填充缺失的部分?

【问题讨论】:

    标签: presto trino


    【解决方案1】:

    您可以使用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 的 cmets 中指出的那样,您可以通过索引访问行字段,因此您可以将相应的行更改为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}

    【讨论】:

    • 在 Trino(以前称为 Presto SQL)中,您可以通过索引访问行字段以避免依赖默认命名,这是一个实现细节,可能会更改:r -> r[1] IS NOT NULL
    • @MartinTraverso 好消息!当我第一次写类似的东西时,索引器是我尝试的第一件事,不幸的是我正在使用 Athena,但它不支持它 =(
    猜你喜欢
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 2019-06-01
    • 2021-09-17
    • 2015-03-31
    相关资源
    最近更新 更多