我想要做的应该很简单:给定一个 BigQuery 架构,我想选择除少数表之外的所有表(包括嵌套表)。棘手的是 BigQuery 有一个嵌套结构,而我想要排除的少数数据嵌套在其他记录中。
我在 BigQuery 文档 中找到了 SELECT * except 子句,这看起来很有希望。问题是它似乎不支持嵌套结构排除。
例如,使用公共 github_nested 数据集,我们可以编写如下查询
#standardSQL
SELECT * except (payload) FROM `bigquery-public-data.samples.github_nested` LIMIT 1000
通过从结果中删除有效负载记录,这成功地达到了我们的预期。现在让我们想象一下,我们只想删除payload.comment,从而在响应中保留其余的有效负载记录内容。我试过了
#standardSQL
SELECT * except (payload.comment) FROM `bigquery-public-data.samples.github_nested` LIMIT 1000
然而,这失败了。
有人知道有什么方法可以实现这一点吗?
谢谢!
思考问题的方法是,你仍然希望结果中有一个
payload
列,但你希望它具有不同的结构,即排除 comment
。在这种情况下,您可以使用 SELECT * REPLACE
进行修改。例如,
#standardSQL
SELECT * REPLACE ((SELECT AS STRUCT payload.* EXCEPT (comment)) AS payload)
FROM `bigquery-public-data.samples.github_nested`
LIMIT 1000;
对于遇到此嵌套
ARRAY
用例的任何人,这里是在选择期间删除嵌套字段的 BigQuery SQL:
#standardSQL
SELECT * REPLACE (ARRAY(SELECT AS STRUCT x.* EXCEPT (comment) FROM UNNEST(payload) x) AS payload)
FROM `bigquery-public-data.samples.github_nested`
LIMIT 1000;
需要额外的
ARRAY()
调用才能按照 UNNEST
的预期将 ARRAY<STRUCT>
的结果重新聚合回 REPLACE
。
这也有效:
#standardSQL
SELECT
*
EXCEPT (payload),
payload.desc AS payload_desc,
payload.action AS payload_action
FROM `bigquery-public-data.samples.github_nested`