应用脚本:对于 bigquery 的响应太大
Posted
技术标签:
【中文标题】应用脚本:对于 bigquery 的响应太大【英文标题】:App Script: response too large for bigquery 【发布时间】:2016-07-26 05:09:53 【问题描述】:我正在使用 Google 应用脚本来自动执行从 BigQuery 导入电子表格的过程。但是应用程序脚本正在返回我
Error 413: Message: response too large
这是我的代码示例,错误在第 5 行
1 var projectId = projectid;
2 var request =
3 query: 'My Query'
4 ;
5 var queryResults = BigQuery.Jobs.query(request, projectId);
有哪些可能的解决方案?是否有任何解决方案不会增加我的 BigQuery 费用?
PS:结果是大约 16 MB 的数据。即大约 300,000 行。
查询:
SELECT
ORDER.addedon AS date,
ORDER.display_order_id AS order_id,
OrderSkuDetails.pid AS pid,
OrderSkuDetails.price AS price,
OrderSkuDetails.saleprice AS saleprice,
OrderSkuDetails.subtotal AS subtotal,
OrderSkuDetails.shippingcharge AS shippingcharge,
OrderSkuDetails.codcharge AS codcharge,
User.email AS email,
ORDER.order_id AS payment_id,
ORDER.payment_mode AS payment_mode,
ORDER.source AS source,
ORDER.user_id AS user_id,
Payments.payment_status AS payment_status,
User.profileJson.text,
OrderStatus.sub_status_id AS sub_status_id,
NProduct.featured AS featured
FROM
FLATTEN([Mixpanel_Import.Order],payment_mode) AS ORDER
INNER JOIN
[Mixpanel_Import.OrderSkuDetails] AS OrderSkuDetails
ON
ORDER.order_id=OrderSkuDetails.order_id
INNER JOIN
[Mixpanel_Import.OrderStatus] AS OrderStatus
ON
ORDER.order_id=OrderStatus.order_id
INNER JOIN
[Mixpanel_Import.User] AS User
ON
ORDER.user_id=User.__key__.id
INNER JOIN
[Mixpanel_Import.Payments] AS Payments
ON
ORDER.order_id=Payments.order_id
INNER JOIN
[Mixpanel_Import.NProduct] AS NProduct
ON
OrderSkuDetails.pid=NProduct.pid
这里是代码
function bigQuery(tableName)
var projectId = 'project';
var request =
query: The Query
;
var queryResults = BigQuery.Jobs.query(request, projectId); //Error on this line
var jobId = queryResults.jobReference.jobId;
Logger.log(jobId);
var sleepTimeMs = 500;
while (!queryResults.jobComplete)
Utilities.sleep(sleepTimeMs);
sleepTimeMs *= 2;
queryResults = BigQuery.Jobs.getQueryResults(projectId, jobId);
while (queryResults.pageToken)
queryResults.concat(BigQuery.Jobs.getQueryResults(projectId, jobId, pageToken: queryResults.pageToken));
return queryResults;
【问题讨论】:
您可能不应该尝试通过网络拉出 300K 行并在您的解决方案中显示它们。我假设您正在构建某种网络前端? @polleyg 基本上是用于数据分析的。我需要拉这么多数据,有什么方法可以做到吗 即使我将结果限制为 10000,错误仍然是一样的。 您能告诉我们您的查询吗?我认为可能有一个子查询产生了太多行。 这就是为什么我建议您展示您的应用脚本,以便我们指出您的问题:o) 【参考方案1】:请尝试在您的工作配置中添加allowLargeResults
,并将值设置为true
。
如Returning large query results中所述
即使结果集很小,返回大结果的查询也需要更长的时间来执行,并且会受到额外的限制:
您必须指定目标表。 您不能指定***ORDER BY
、TOP
或LIMIT
子句。这样做会抵消使用allowLargeResults
的好处,因为查询输出不能再并行计算。 只有与PARTITION BY
子句结合使用时,窗口函数才能返回较大的查询结果。
如果这不起作用,建议的解决方案和可能解决以下问题的想法也可能会有所帮助:
Loading a Lot of Data into Google Bigquery from Python GitHub-HTTP Error 413 Request Entity Too Large除此之外,还可以在Troubleshooting Errors 中找到有关使用 BigQuery 时出现错误的信息。
【讨论】:
以上是关于应用脚本:对于 bigquery 的响应太大的主要内容,如果未能解决你的问题,请参考以下文章
BigQuery 在小表上为 COUNT(*) 提供“响应太大”
尝试 ORDER BY 时 BigQuery“响应太大而无法返回”
BigQuery 对整个数据集给出响应太大错误,但对等效子查询没有
Google Bigquery 通过简单的选择说“响应太大而无法返回”