微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从 NESTED 字段中的 ARRAY 中删除 STRUCT

如何解决如何从 NESTED 字段中的 ARRAY 中删除 STRUCT

是否有一种简单的方法可以从 BigQuery 中的嵌套和重复字段删除 STRUCT(BQ 表列类型:记录,模式:重复)。

假设我有以下表格:

  1. 愿望清单
name    toy.id  toy.priority
Alice   1       high
        2       medium
        3       low
Kazik   3       high
        1       medium
  1. 玩具
id  name    available
1   car     0
2   doll    1
3   bike    1

我想从心愿单中删除不可用的玩具 (toys.available==0)。在这种情况下,它是 toy.id==1。

因此,愿望清单将如下所示:

name    toy.id  toy.priority
Alice   2       medium
        3       low
Kazik   3       high

我知道如何选择它:

WITH `project.dataset.wishlist` AS
(
  SELECT 'Alice' name,[STRUCT<id INT64,priority STRING>(1,'high'),(2,'medium'),(3,'low')] toy UNION ALL
  SELECT 'Kazik' name,priority STRING>(3,(1,'medium')]
),toys AS (
  SELECT 1 id,'car' name,0 available UNION ALL
  SELECT 2 id,'doll' name,1 available UNION ALL
  SELECT 3 id,'bike' name,1 available
)
SELECT wl.name,ARRAY_AGG(STRUCT(unnested_toy.id,unnested_toy.priority)) as toy
FROM `project.dataset.wishlist` wl,UNnesT (toy) as unnested_toy
LEFT JOIN toys t ON unnested_toy.id=t.id
WHERE t.available != 0
GROUP BY name

但我不知道如何在 toy.available==0 时从愿望清单中删除结构

有非常相似的问题,例如 How to delete/update nested data in bigqueryHow to Delete rows from Structure in bigquery,但答案要么在删除方面对我来说不清楚,要么建议使用选择语句将整个愿望清单复制到新表中。我的“愿望清单”很大,“toys.availabililty”经常变化。复制它在我看来效率很低。

您能否建议一个符合 BQ 最佳实践的解决方案?

谢谢!

解决方法

...由于BQ中实现了行删除,所以我认为行内的STRUCT删除也是可以的。

您可以为此使用 UPDATE DML(不是 DELETE,因为它用于删除整行,而 UPDATE 可用于修改行)

update `project.dataset.wishlist` wl
set toy = ((
  select array_agg(struct(unnested_toy.id,unnested_toy.priority)) 
  from unnest(toy) as unnested_toy
  left join `project.dataset.toys` t on unnested_toy.id=t.id
  where t.available != 0
))
where true;   
,

您可以UNNEST()并重新聚合:

SELECT wl.name,(SELECT ARRAY_AGG(t)
        FROM UNNEST(wl.toy) t JOIN
             toys
             ON toys.id = t.id
        WHERE toys.available <> 0
       ) as available_toys
FROM `project.dataset.wishlist` wl;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。