【问题标题】:BigQuery select * except nested columnBigQuery 选择 * 嵌套列除外
【发布时间】:2017-04-22 12:44:37
【问题描述】:

我想做的事情应该很简单:给定一个 BigQuery 架构,我想选择除少数几个表之外的所有表(包括嵌套表)。棘手的是 BigQuery 具有嵌套结构,而我要排除的少数几个嵌套在其他记录中。

我在BigQuery documentation 中找到了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


    【解决方案1】:

    这也有效:

    #standardSQL
    SELECT 
      * 
      EXCEPT (payload),
      payload.desc AS payload_desc,  
      payload.action AS payload_action
    FROM `bigquery-public-data.samples.github_nested`
    

    【讨论】:

      【解决方案2】:

      思考问题的方法是,您仍然希望结果中有一个payload 列,但您希望它具有不同的结构,即排除comment。在这种情况下,您可以使用SELECT * REPLACE 进行修改。例如,

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

      【讨论】:

      • 谢谢你,艾略特。这确实解决了我上面概述的问题。不幸的是,我一直是一个糟糕的问题发布者,并意识到我的案例在重复字段中有点棘手(示例中没有)。我会为这个问题添加一个更新。再次道歉!
      • 如果这回答了原始问题,您介意将其标记为已接受吗?随意发布与重复字段相关的问题的另一个变体。谢谢!
      • 如果这是 stackoverflow 上使用的约定,当然可以。感谢您的帮助!
      猜你喜欢
      • 1970-01-01
      • 2017-08-22
      • 1970-01-01
      • 1970-01-01
      • 2017-04-22
      • 1970-01-01
      • 2016-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多