使用 BigQuery LegacySQL 处理数组

Posted

技术标签:

【中文标题】使用 BigQuery LegacySQL 处理数组【英文标题】:Working with arrays with BigQuery LegacySQL 【发布时间】:2018-02-07 14:37:43 【问题描述】:

我表中的每一行都有一个字段是一个数组,我想从第一个数组条目中获取一个字段。

例如,如果我的行是

[
  
    "user_dim": 
      "user_id": "123",
      "user_properties": [
        
          "key": "content_group",
          "value": 
            "value": 
              "string_value": "my_group"
            
          
        
      ]
    ,
    "event_dim": [
      
        "name": "main_menu_item_selected",
        "timestamp_micros": "1517584420597000"
      ,
      
        "name": "screen_view",
        "timestamp_micros": "1517584420679001"
      
    ]
  
]

我想要

user_id:123,content_group:my_group,timestamp_1517584420597000

【问题讨论】:

是否有理由为此使用旧版 SQL?这是可能的,但标准 SQL 具有更好的数组支持。 @ElliottBrossard 感谢您的评论! :) 我将查询与 TABLE_DATE_RANGE([app_events_], TIMESTAMP('2018-01-29'), TIMESTAMP('2018-02-02')) 结合起来,但我还没有找到标准的 SQL 等价物。有吗? 是的,请查看documentation for wildcard tables。您将从app_events_* 中选择并过滤例如_TABLE_SUFFIX BETWEEN '20180129' AND '20180202'(假设是正确的后缀)。 【参考方案1】:

正如 Elliott 所提到的 - BigQuery 标准 SQL 对 ARRAY 的支持比旧版 SQL 要好得多。一般来说,BigQuery 团队建议使用标准 SQL

所以,下面是 BigQuery 标准 SQL(包括处理通配符)

#standardSQL
SELECT 
  user_dim.user_id AS user_id,
  (SELECT value.value.string_value 
     FROM UNNEST(user_dim.user_properties) 
     WHERE key = 'content_group' LIMIT 1
  ) content_group,
  (SELECT event.timestamp_micros 
     FROM UNNEST(event_dim) event 
     WHERE name = 'main_menu_item_selected'
  ) ts
FROM `project.dataset.app_events_*`
WHERE _TABLE_SUFFIX BETWEEN '20180129' AND '20180202'   

结果(对于您问题中的虚拟示例)

Row     user_id     content_group       ts   
1       123         my_group            1517584420597000     

【讨论】:

被否决,因为问题专门询问旧版 SQL,而此答案涉及标准 SQL。这不是一个答案,只是一个建议,因此应该是一个评论。 感谢@Crembo 离开 cmets,所以这次投票不会像没有推理的情况下那样令人困惑。真的很感激!想要跟进这一点 - 正如您从问题本身的 cmets 中看到的那样 - OP 最初并不知道有一种方法可以使用标准 sql 来实现它,并且实际上询问是否存在与他在标准 sql 中所要求的等效项 - 并且这就是我的回答:o) 我们通常为标准 sql 与旧 sql 提供答案的另一个原因是 BigQuery 团队非常推荐它,因为他们建议用户迁移到标准 :)

以上是关于使用 BigQuery LegacySQL 处理数组的主要内容,如果未能解决你的问题,请参考以下文章

Bigquery Standard Sql 等效于 Legacy Sql 中的 LAST()

bigquery 标准 sql 获取 dayofweek

从 BigQuery 导出自定义维度

在 BigQuery 中滚动 7 天

bigquery 标准 sql 错误,时间戳无效

BigQuery 文档 - 为啥 flatten 会消除重复