微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

对Google Bigquery中的嵌套字段使用OFFSET而不是UNNEST

如何解决对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的重排。

enter image description here

第二个查询使用UNnesT来访问嵌套数据。改组后的字节数约为(!)75 MB

enter image description here

两种情况下处理的数据量都是相同的。

现在,问题是:

这是否意味着根据涉及优化插槽之间通信的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 举报,一经查实,本站将立刻删除。