【问题标题】:Querying nested data in bigquery在 bigquery 中查询嵌套数据
【发布时间】:2020-05-20 07:51:20
【问题描述】:

我正在尝试提取我按主机名过滤的 bigquery 谷歌分析数据中的所有列。 但是,结果仍显示其他主机名,如屏幕截图所示。 我正在使用过滤器进行此选择,以将数据复制到具有相同架构的另一个数据集。

以下查询:

SELECT g.* FROM `10241241.ga_sessions_20160805` g, UNNEST (hits) as hits WHERE hits.page.hostname= "www.googlemerchandisestore.com"

更新 如何在不更改嵌套结构的情况下复制相同的架构?

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    您要过滤的值位于数组中...因此您可以过滤/清理数组或排除包含不包含该值的数组的行或排除不仅包含该值的行。不确定哪个适用于您,因为您似乎没有理由将数组与整个表交叉连接(这会使它非常膨胀)。

    清理数组:

    SELECT 
      * 
      REPLACE( 
        ARRAY(SELECT AS STRUCT * FROM g.hits WHERE page.hostname='www.googlemerchandisestore.com') AS hits
        ) 
    FROM `bigquery-public-data.google_analytics_sample.ga_sessions_20160805` g
    limit 1000
    

    排除不包含值的行

    SELECT 
      * 
    FROM `bigquery-public-data.google_analytics_sample.ga_sessions_20160805` g
    WHERE
      (SELECT COUNT(1)>0 FROM g.hits WHERE page.hostname='www.googlemerchandisestore.com')
    limit 1000
    

    等等

    【讨论】:

    • 它确实有效!我使用了第一个,因为我需要将所有列添加到新表中。谢谢!
    【解决方案2】:

    您不应再次添加命中列。另外,我建议您为未嵌套的列使用不同的名称。这样就更容易理解了。

    SELECT g.* EXCEPT(hits), hit 
    FROM `10241241.ga_sessions_20160805` g, UNNEST (hits) as hit 
    WHERE hits.page.hostname= "www.googlemerchandisestore.com"
    

    【讨论】:

    • 它起作用了,但是,在复制的目标中,命中成为命中,并且也改变了架构。似乎它不再被认为是嵌套的。我如何使它与从源表中复制的一样?附上截图
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多