使用 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 导致文本从原始位置移位
BigQuery 文档 - 为啥 flatten 会消除重复