Presto 中如何使用 UNNEST 操作?

推荐答案

在 Presto 中,UNNEST 操作用于将数组或映射类型的列展开为多行。它通常与 CROSS JOIN 结合使用,以便将数组中的每个元素展开为单独的行。

示例

假设有一个表 orders,其中包含一个数组类型的列 items,表示每个订单中的商品列表。我们可以使用 UNNEST 操作将 items 列展开为多行:

在这个查询中:

  • orders 是包含订单数据的表。
  • itemsorders 表中的数组列。
  • UNNEST(items)items 数组展开为多行,每行包含一个数组元素。
  • AS t(item) 为展开后的结果指定了一个别名 t,并且 item 是展开后的列名。

结果

假设 orders 表中有以下数据:

order_id items
1 ['apple', 'banana']
2 ['orange']

执行上述查询后,结果将是:

order_id item
1 apple
1 banana
2 orange

本题详细解读

1. UNNEST 的作用

UNNEST 是 Presto 中用于处理数组或映射类型数据的操作符。它将数组或映射中的元素展开为多行,使得每个元素都可以单独处理。这在需要对数组中的每个元素进行单独操作时非常有用。

2. CROSS JOIN 的作用

CROSS JOIN 用于将两个表的每一行进行组合。在与 UNNEST 结合使用时,CROSS JOIN 会将原始表中的每一行与 UNNEST 展开后的每一行进行组合,从而生成最终的结果。

3. 使用场景

UNNEST 操作在以下场景中非常有用:

  • 当需要将数组中的每个元素作为单独的行进行处理时。
  • 当需要对数组中的元素进行聚合、过滤或其他操作时。
  • 当需要将数组或映射类型的数据转换为关系型数据时。

4. 注意事项

  • UNNEST 操作会生成多行数据,因此在使用时要注意结果集的大小。
  • 如果数组为空,UNNEST 不会生成任何行。
  • UNNEST 可以与多个数组列一起使用,展开后的结果将是这些数组的笛卡尔积。

5. 示例扩展

假设 orders 表中还有一个数组列 quantities,表示每个订单中每个商品的数量。我们可以同时展开 itemsquantities 列:

在这个查询中,UNNEST(items, quantities)itemsquantities 数组同时展开,并且每个 item 对应一个 quantity

6. 结果

假设 orders 表中有以下数据:

order_id items quantities
1 ['apple', 'banana'] [2, 3]
2 ['orange'] [1]

执行上述查询后,结果将是:

order_id item quantity
1 apple 2
1 banana 3
2 orange 1
纠错
反馈