2017-09-01 93 views
1

我正在使用标准SQL。尽管它的基本查询仍然存在引发错误的问题。任何建议请查询失败错误:在查询执行过程中超出资源:查询无法在分配的内存中执行

SELECT 
    fullVisitorId, 
    CONCAT(CAST(fullVisitorId AS string),CAST(visitId AS string)) AS session, 
    date, 
    visitStartTime, 
    hits.time, 
    hits.page.pagepath 
FROM 
    `XXXXXXXXXX.ga_sessions_*`, 
    UNNEST(hits) AS hits 
WHERE 
    _TABLE_SUFFIX BETWEEN "20160801" 
    AND "20170331" 
ORDER BY 
    fullVisitorId, 
    date, 
    visitStartTime 

回答

4

此查询工作的唯一方法是通过去除最终应用的排序:

SELECT 
    fullVisitorId, 
    CONCAT(CAST(fullVisitorId AS string),CAST(visitId AS string)) AS session, 
    date, 
    visitStartTime, 
    hits.time, 
    hits.page.pagepath 
FROM 
    `XXXXXXXXXX.ga_sessions_*`, 
    UNNEST(hits) AS hits 
WHERE 
    _TABLE_SUFFIX BETWEEN "20160801" 
    AND "20170331" 

ORDER BY操作是相当昂贵的,并且不能被并行处理,从而尽量避免它(或尝试将其应用于有限的结果集中)

+0

谢谢Willian。它正在工作,但是当我使用order by时,你能告诉我为什么它不起作用吗? – Harish

+2

在单个节点上的内存中存放的行太多。如果您查看查询的“说明”选项卡,它将显示内存耗尽的位置。 –

+0

谢谢@ElliottBrossard – Harish

0

除了接受的答案,您可能希望按日期对表进行分区以减少使用昂贵查询的内存量。

+0

上面的查询是拉取GA数据,默认情况下它是按日期分区的。 _TABLE_SUFFIX“20160801” AND“20170331” 这就是我如何从不同日期范围提取数据 – Harish