尝试 ORDER BY 时 BigQuery“响应太大而无法返回”

Posted

技术标签:

【中文标题】尝试 ORDER BY 时 BigQuery“响应太大而无法返回”【英文标题】:BigQuery "Response Too Large To Return" when trying to ORDER BY 【发布时间】:2014-06-02 20:42:58 【问题描述】:

我有一个查询,可以找到用户“最后”一天的所有事件(即 2 周以上没有再次出现)。我想将其缩减为他们在离开之前执行的最后 N 个事件,按最近到最近的顺序排列。

我没有问题地创建了一个无序表,但是当我尝试 ORDER BY timestamp DESC 时,它会给我一个“响应太大而无法返回”错误。 为什么我在尝试排序(没有 GROUP BY 或其他任何内容)时出现此错误,但在无序表上却没有?

已编辑以在下方添加查询

此查询为我提供了一个表格,其中包含过去 14 天内未出现的用户的事件。

SELECT user.user_key as user_key, user.lastTime as lastTime, evt.actiontime as actiontime, evt.actiontype as actiontype, evt.action_parameters.parameter_name as actionParameterName
FROM (
  SELECT user_key , MAX(actiontime) AS lastTime, DATE(MAX(actiontime)) as lastDate
  FROM [db.action_log]
  WHERE DATEDIFF(CURRENT_TIMESTAMP(), actiontime) >= 14
  GROUP EACH BY user_key
  HAVING DATEDIFF(CURRENT_TIMESTAMP(), lastTime) >= 14) as user
JOIN EACH(
  SELECT user_key, actiontime, actiontype, action_parameters.parameter_name, DATE(actiontime) as actionDate
  FROM [db.action_log]
  WHERE DATEDIFF(CURRENT_TIMESTAMP(), actiontime) >= 14) as evt
ON (user.user_key = evt.user_key) AND (user.lastDate = evt.actionDate)
WHERE actiontime <= lastTime;

这运行得很好。我想 GROUP_CONCAT() 将动作变成一个列表,但首先我需要按动作时间(降序)排序,以便最近的事件是列表中的第一个。但是当我运行时:

SELECT user_key, lastTime, actiontime, user_level, actiontype, actionParameterName
FROM [db.lastActions]
ORDER BY actiontime DESC;

我收到“响应太大而无法返回”。

【问题讨论】:

如果可能的话,请包括一个查询,更多的人将能够提供帮助。或者工作 ID,如果它看起来像团队应该调试的错误,但在 *** 上更喜欢社区方法。 好点,最初应该包括这些。在初始帖子中编辑的查询。 排序作为一项操作不是分布式的,因此它仅限于一个节点中可以容纳的所有数据。为了测试这一点,您能否检查在过滤掉一大块原始数据时是否运行相同的查询? 我尝试使用 HASH 进行过滤。如果我做 WHERE HASH(user_key) % 100 = 0,这工作正常。如果我执行 HASH(user_key) % 100 【参考方案1】:

当您在单个查询中包含太多 group, order and group_concats 组合时,BQ 有时会对您大喊大叫。 但是,我相信直接的 group_concat 确实 not 创建有序列表,因此在这种情况下,在 concat 之前执行 order by 基本上没有意义。 This question 应该可以解决你的问题

为了完成,我找到了几种有用的方法来避免被大喊大叫(无论出于何种原因): 1)如果可能的话,把你的脚本分成更小的部分。通过这种方式,您可以在处理数据时拥有更多控制权。 2)不要使用order by,然后使用limit,使用更多的where语句会更快,并且可能更有用。 3) 明智地使用子选择。例如,先分组再排序应该总是比先排序更快。

【讨论】:

以上是关于尝试 ORDER BY 时 BigQuery“响应太大而无法返回”的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery Storage API 无法读取由有序 (ORDER BY) 查询创建的临时表

带有“Order Each by”子句的 Google BigQuery 大表(105M 记录)产生“资源超出查询执行”错误

优化 sum() over(order by...) 子句抛出“超出资源”错误

如何在蛋糕php 3中在Group by之前执行Order by?

从存储过程中的视图中选择时不能使用 ORDER BY

Mysql5.7中子查询时order by与group by合用无效的解决办法