如何解决对Google Bigquery中的嵌套字段使用OFFSET而不是UNNEST
对GBQ专家的快速提问。
这是两个目的相同的查询
first
SELECT
fullVisitorId AS userid,CONCAT(fullVisitorId,visitStartTime) AS session,visitStartTime + (hits[
OFFSET(0)].time / 1000) AS eventtime,date,trafficSource.campaign,trafficSource.source,trafficSource.medium,trafficSource.adContent,trafficSource.adwordsClickInfo.campaignId,geoNetwork.region,geoNetwork.city,trafficSource.keyword,totals.visits AS visits,device.deviceCategory AS deviceType,hits[OFFSET(0)].eventInfo.eventAction,hits[OFFSET(0)].TRANSACTION.transactionId,hits[OFFSET(0)].TRANSACTION.transactionRevenue,SUBSTR(channelGrouping,3) AS newchannelGrouping
FROM
`some_site.ga_sessions_*`
WHERE
ARRAY_LENGTH(hits) > 0
AND _table_suffix BETWEEN '20200201'
AND '20200201'
AND fullVisitorId IN (
SELECT
disTINCT(fullVisitorId)
FROM
`some_site.ga_sessions_*`,UNnesT(hits) AS hits
WHERE
_table_suffix BETWEEN '20200201'
AND '20200201'
AND (hits.TRANSACTION.transactionId != 'None')
)
second
SELECT
fullVisitorId AS userid,visitStartTime + (hits.time / 1000) AS eventtime,hits.eventInfo.eventAction,hits.TRANSACTION.transactionId,hits.TRANSACTION.transactionRevenue,3) AS newchannelGrouping
FROM
`some_site.ga_sessions_*`,UNnesT(hits) hits
WHERE
_table_suffix BETWEEN '20200201' AND '20200201'
AND fullVisitorId IN (
SELECT
disTINCT(fullVisitorId)
FROM
`some_site.ga_sessions_*`,UNnesT(hits) AS hits
WHERE
_table_suffix BETWEEN '20200201'
AND '20200201'
AND (hits.TRANSACTION.transactionId != 'None')
)
第一个使用OFFSET
从嵌套字段中提取数据。根据执行细节报告,该查询需要大约1.5 MB的重排。
第二个查询使用UNnesT
来访问嵌套数据。改组后的字节数约为(!)75 MB
两种情况下处理的数据量都是相同的。
现在,问题是:
这是否意味着根据涉及优化插槽之间通信的this article,我应该使用OFFSET
而不是UNnesT
来获取存储在嵌套字段中的数据?
谢谢!
解决方法
让我们考虑以下使用BigQuery公共数据集的示例。
UNNEST-返回6个结果:
WITH t AS (SELECT * FROM `bigquery-public-data.google_analytics_sample.ga_sessions_20170801` WHERE visitId = 1501571504 )
SELECT h FROM t,UNNEST(hits) h
偏移-返回1个结果:
WITH t AS (SELECT * FROM `bigquery-public-data.google_analytics_sample.ga_sessions_20170801` WHERE visitId = 1501571504 )
SELECT hits[OFFSET(0)] FROM t
两个查询都引用了GA公共表中的同一条记录。他们表明,与UNNEST一起使用联接将使数组中的每个元素移入一行,而使用OFFSET(0)将仅使数组的第一个元素移入一行。
高数据混洗之所以不同,是因为UNNEST执行JOIN操作,该操作要求以特定方式组织数据。 OFFSET方法仅采用数组的第一个元素。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。