使用 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 处理数组的主要内容,如果未能解决你的问题,请参考以下文章