BigQuery 选择 * 除嵌套列之外

问题描述 投票:0回答:3

我想要做的应该很简单:给定一个 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

然而,这失败了。

有人知道有什么方法可以实现这一点吗?

谢谢!

sql google-bigquery
3个回答
30
投票

思考问题的方法是,你仍然希望结果中有一个

payload
列,但你希望它具有不同的结构,即排除
comment
。在这种情况下,您可以使用
SELECT * REPLACE
进行修改。例如,

#standardSQL
SELECT * REPLACE ((SELECT AS STRUCT payload.* EXCEPT (comment)) AS payload)
FROM `bigquery-public-data.samples.github_nested`
LIMIT 1000;

0
投票

对于遇到此嵌套

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


-2
投票

这也有效:

#standardSQL
SELECT 
  * 
  EXCEPT (payload),
  payload.desc AS payload_desc,  
  payload.action AS payload_action
FROM `bigquery-public-data.samples.github_nested`
© www.soinside.com 2019 - 2024. All rights reserved.