了解导致资源超出的原因" GBQ中的错误?

时间:2017-06-16 10:11:59

标签: sql google-analytics google-bigquery

我在Google Analytics数据库中使用BigQuery。在开发查询的各个阶段,我得到错误:"资源超出"。我希望进一步了解发生了什么。我成功地解决了这个问题,但只能通过反复试验。

当我使用解释工具时,似乎是'计算'任何看起来超出资源的查询或子查询的一部分。

以下是标准SQL查询成功/失败的示例,具体取决于是否保留了某些部分:

  SELECT
    fullVisitorId,
    visitId,
    h.type AS type,
    h.hitNumber AS hitNumber,
    h.eventInfo.eventAction AS action,
    LOWER(h.eventInfo.eventCategory) AS category,
    h.page.pagePath AS page,
    h.page.pageTitle AS landingTitle,
    h.page.searchKeyword AS searchTerm,
    LEAD(h.page.pagePath) OVER (PARTITION BY fullVisitorId, visitId ORDER BY h.hitNumber ASC) AS landingPage,
    SPLIT(h.eventInfo.eventLabel, ':')[OFFSET(0)] AS clickTitle,
    CASE WHEN LEAD(h.page.pageTitle) OVER (PARTITION BY fullVisitorId, visitId ORDER BY h.hitNumber ASC) = SPLIT(h.eventInfo.eventLabel, ':')[OFFSET(0)] THEN true ELSE false END AS searchClick     
 FROM `project.dataset.ga_sessions_*` AS main, UNNEST(hits) AS h 
  WHERE _TABLE_SUFFIX BETWEEN '20170401' AND '20170430'
AND (
  (
    h.eventInfo.eventAction = 'click' AND LOWER(h.eventInfo.eventCategory) LIKE '/search%'
  )
    OR type = 'PAGE'
)
ORDER BY
  fullVisitorId ASC, visitId ASC, h.hitNumber ASC

当删除这些元素集中的任何一个时,查询运行:

ORDER BY
  fullVisitorId ASC, visitId ASC, h.hitNumber ASC

或者:

LEAD(h.page.pagePath) OVER (PARTITION BY fullVisitorId, visitId ORDER BY h.hitNumber ASC) AS landingPage,
SPLIT(h.eventInfo.eventLabel, ':')[OFFSET(0)] AS clickTitle,
CASE WHEN LEAD(h.page.pageTitle) OVER (PARTITION BY fullVisitorId, visitId ORDER BY h.hitNumber ASC) = SPLIT(h.eventInfo.eventLabel, ':')[OFFSET(0)] THEN true ELSE false END AS searchClick

或者:

在单个日期分区上运行时,整个查询都会运行。

我会将目前的理解水平描述为肤浅的,我对GBQ的内部工作原理以及它如何分配/允许计算资源知之甚少。我知道它尽可能在不同的机器上执行计算。我之前听说过这些被描述为碎片。

我需要了解哪些GBQ计算资源才能理解为什么上述工作/不工作?

N.B:我只有第1级访问权限,但这并不意味着如果我可以证明需要,我就无法获得更多的访问权限。显然,我不想以目前的理解水平做到这一点。

1 个答案:

答案 0 :(得分:3)

我认为在您的查询中唯一应该导致问题的是ORDER BY操作。正如您在约旦的answer中所看到的,此操作无法并行化。您还可以查看docs以了解导致资源超出错误的原因。

其余的查询似乎很好。我根据我们的数据测试了您的查询,它在20多秒内处理了近300Gb:

enter image description here

如果您仍然收到错误,那么您可能正在查询相当多的数据。在这种情况下,您可以尝试将查询分解为较小的日期范围,查询较少的列,添加一些WHERE条件以过滤掉某些行,更改层等等。