使用 FLATTEN 的 SQL 调用导致“错误:查询执行期间超出资源”

Posted

技术标签:

【中文标题】使用 FLATTEN 的 SQL 调用导致“错误:查询执行期间超出资源”【英文标题】:"Error: Resources exceeded during query execution" resulting from SQL call using FLATTEN 【发布时间】:2014-09-04 03:56:59 【问题描述】:

我目前正尝试在 BigQuery 中运行以下 SQL 脚本(目的是保存表),但在我开始查询后遇到与容量相关的 SQL 处理错误,没有行返回大小限制。错误是常见的错误:“错误:查询执行期间超出资源。”

SELECT date, 
       Concat(fullvisitorid, String(visitid)) AS unique_visit_id, 
       visitid, 
       visitnumber, 
       fullvisitorid, 
       totals.pageviews, 
       totals.bounces, 
       hits.page.pagepath, 
       hits.page.pagetitle, 
       device.devicecategory, 
       device.browser, 
       device.browserversion, 
       hits.customvariables.index, 
       hits.customvariables.customvarname, 
       hits.customvariables.customvarvalue, 
       hits.time 
FROM   (Flatten([XXXXXXXX.ga_sessions_20140711], hits.time)) 
WHERE  hits.customvariables.index = 4 
ORDER  BY unique_visit_id DESC, 
          hits.time ASC 

为作业提供的作业 ID 是:ua-web-analytics:job_60fxNnmo9gZ23kaji50v3qH9dXs。我已经阅读了有关这些错误主题的其他帖子,例如as this post which focuses on the resource errors observed completing a join. 我怀疑现在的问题是使用 FLATTEN,并且正在通过一些不同的方法进行工作。也就是说,我很担心,因为将来,这个查询可能会一起运行 30 或 60 天(而我现在正在做原型设计的只是一天),这将大大增加数据大小,从 500GB 到 1TB。上述查询的目标是生成一个表,我可以将其保存出来然后对其进行操作。不幸的是,以 Ad Hoc 方式执行此操作似乎有些问题。有没有其他人在使用类似的 SQL 查询时遇到过资源限制?就上下文而言,正在查询的表大小约为 17.2 GB,行数刚刚超过一百万。

【问题讨论】:

你需要设置:允许大结果 知道了。谢谢!我注意到的关键点是需要提前指定一个表才能使用“允许大结果”选项标志! 【参考方案1】:

I've been through exactly the same problem 我真的很想要 ORDER BY,所以Jordan Tigani 的答案不是一个选项。

    在没有ORDER BY 的情况下运行查询并保存在数据集表中。

    使用通配符 (BUCKETNAME/FILENAME*.csv) 将该表中的内容导出到 GCS 中的存储桶

    将文件下载到您机器中的文件夹中。

    之后安装XAMPP (if you get a UAC warning) 和change some settings。

    在 XAMPP 控制面板中启动 Apache 和 mysql

    安装 HeidiSQL 并与您的 MySQL 服务器建立连接(安装了 XAMPP)

    创建一个数据库和一个包含其字段的表。

    Go to Tools > Import CSV file, configure accordingly 并导入。

    导入所有数据后,执行ORDER BY 并导出表格。

【讨论】:

【参考方案2】:

正如@Pentium10 提到的,设置允许大结果将允许您从展平查询返回更大的结果。通常,您应该使用“允许大结果”的信号是您看到“结果太大”错误。

但是,查询的另一部分是不可并行的:ORDER BY 操作。这是必需的吗?通常,我们发现大多数情况下,当ORDER BY 用于大表时,人们真正想要的是ORDER BY ... LIMIT(可以高效地并行完成)。或者他们只是添加了 ORDER BY,因为它可以更容易地观察结果。如果您可以删除ORDER BY,它可能会使您的查询更快,并且随着数据大小的增加更好地扩展。

【讨论】:

有趣。我认为 ORDER BY 是必需的。我正在做的是为每次唯一访问生成一个列表,显示每次点击的特定路径。有一个大的 CASE 语句指定“如果错误消息 URL YYY 之前的路径是 XXXX”,那么做一些事情。我的想法是使用 hits.time 为每次访问按顺序排列路径,然后使用 LAG 回顾错误消息前一行的路径。你对乔丹有什么建议吗?如果我可以在不使用 ORDER BY 的情况下解决这个问题,那么也许我们会没事的! 由于您将使用 LAG,而不是最后的 ORDER BY,因此您可以使用 LAG(x) OVER(PARTITION BY unique_visit_id ORDER BY hits.time)。一旦开始分区,查询就可以并行化了。

以上是关于使用 FLATTEN 的 SQL 调用导致“错误:查询执行期间超出资源”的主要内容,如果未能解决你的问题,请参考以下文章

PDFBOX Flatten Acro-form 导致文本从原始位置移位

导致死锁错误的 SQL 查询

BigQuery 文档 - 为啥 flatten 会消除重复

语法错误,“FLATTEN”处或附近出现意外符号

对表使用 sql server 2005 同义词会导致动态查询生成错误

BigQuery 中的表函数和 FLATTEN