在资源限制内使用BigQuery每月获取事件

时间:2017-06-06 20:56:34

标签: google-bigquery

我已将Google Analytics的数据导出到Big Query。它现在有了ca. 14个月的数据,包含ca. 430米活动。我想运行一个查询来获取每月事件的总数(例如201701,201702等)。

我写了一个查询,但它只会在一段时间内运行。 4-6天。如果我把它做得更大,我会得到“在查询执行期间超出资源”。信息。以下是我的查询。在制定此查询时我在哪里出错了?或者我应该完全不同地处理这个问题(只是初学者......)

查询:

SELECT
  MonthYear,
  EXACT_COUNT_DISTINCT(combinedVisitorId) AS EventCount,
FROM (
  SELECT
    CONCAT(fullVisitorId,"-",STRING(visitId),"-",STRING(hits.hitNumber)) AS combinedVisitorId,
    hits.eventInfo.eventCategory AS EventCategory,
    CONCAT(CAST(YEAR(SEC_TO_TIMESTAMP(visitStartTime)) AS STRING), LPAD(CAST(MONTH(SEC_TO_TIMESTAMP(visitStartTime)) AS STRING), 2, '0')) AS MonthYear,
  FROM
    TABLE_DATE_RANGE([XXX:79296192.ga_sessions_], TIMESTAMP("2016-04-01"), TIMESTAMP("2017-05-30"))
  WHERE
    hits.type="EVENT" )
GROUP BY
  MonthYear
ORDER BY
  EventCount DESC

2 个答案:

答案 0 :(得分:1)

尝试类似下面的内容 - 适用于BigQuery Standard SQL

  
#standardSQL
SELECT
  YearMonth,
  COUNT(DISTINCT combinedVisitorId) AS EventCount
FROM (
  SELECT
    SUBSTR(_TABLE_SUFFIX, 1, 6) AS YearMonth,
    CONCAT(fullVisitorId,"-",STRING(visitId),"-",STRING(hits.hitNumber)) AS combinedVisitorId
  FROM `XXX.79296192.ga_sessions_*`
  WHERE _TABLE_SUFFIX BETWEEN "20160401" AND "20170530"
  AND hits.type="EVENT" 
)
GROUP BY YearMonth
-- ORDER BY EventCount DESC  

注意:我为combinedVisitorId留下了逻辑,因为它假设这正是你想要对待访客的方式
此外,您可以将上面的内容组合到一个select语句中(不带子查询) - 但我这样写的方式是为了强调使用通配符的方法

答案 1 :(得分:1)

强烈建议您在BigQuery中使用Standard SQL版本。如果你想计算总事件,这可能适合你:

SELECT
  SUM((SELECT COUNTIF(hits.type = 'EVENT') FROM UNNEST(hits) hits)) total_events,
FORMAT_DATE("%B", PARSE_DATE("%Y%m%d", date)) month
FROM `project_id.dataset_id.ga_sessions*`
WHERE
1 = 1
AND CASE WHEN (REGEXP_CONTAINS(_table_suffix, 'intraday') AND REGEXP_EXTRACT(_table_suffix, r'.*_(.*)') BETWEEN "20170606" AND "20170606" ) THEN TRUE
  WHEN (NOT REGEXP_CONTAINS(_table_suffix, 'intraday') AND REGEXP_EXTRACT(_table_suffix, r'.*_(.*)') BETWEEN "20160605" AND "20170605") THEN TRUE END
GROUP BY month

我在这里测试了整整一年,它在大约30秒内处理完毕。请注意,如果您使用超过一年,那么数据将在同一个月内进行分组。