如何从大查询中获取多个查询的所有结果?
Posted
技术标签:
【中文标题】如何从大查询中获取多个查询的所有结果?【英文标题】:How to get all results from multiple queries from big query? 【发布时间】:2021-06-15 20:49:10 【问题描述】:我使用 firebase 云函数,我有一个函数可以获取 SQL 请求并调用 bigquery 并将结果返回到我的 ios/android 应用程序。 但如果我想发送多个请求,我只会得到 1 个结果。 我读到了这篇文章,发现我需要在工作中做这件事,有人可以帮助我吗?
exports.callBigQuery = async (data, context) =>
const queryFrom = data.text;
const [rows] = [];
const options =
query: queryFrom,
;
const [jobs] = await bigqueryClient.createQueryJob(options);
jobs.forEach(job =>
const item = job.getQueryResults();
rows.push(item);
console.log(item);
);
console.log(rows);
return rows;
;
这是我发送到“callBigQuery”函数的查询(如果我在 bigquery 控制台上运行它,我会得到 2 个结果):
let str = "SELECT * FROM 'table_name_1' where isWorking = 'true' limit 1; SELECT * FROM `table_name_2` where isWorking = 'true'"
【问题讨论】:
【参考方案1】:您的查询被解释为脚本。考虑到 BigQuery UI 将脚本的结果显示为单个查询的链接。可能有一种方法可以在日志中搜索每个查询的作业 ID,然后获取结果。 我认为最简单的解决方案是运行一个查询读取结果,然后重复第二个查询。您甚至可以并行运行这 2 个查询,而不是在脚本中执行它们时按顺序运行。
已编辑:
来自 BigQuery scripting docs
脚本在 BigQuery 中使用 jobs.insert 执行,类似于任何其他查询,其中多语句脚本指定为查询文本。当脚本执行时,会为脚本中的每个语句创建额外的作业,称为子作业。您可以通过调用 jobs.list 枚举脚本的子作业,将脚本的作业 ID 作为 parentJobId 参数传入。
在脚本上调用jobs.getQueryResults 时,它将返回脚本中要执行的最后一个SELECT、DML 或DDL 语句的查询结果,如果以上语句均未执行,则没有查询结果。要获取脚本中所有语句的结果,请枚举子作业并在每个子作业上调用 jobs.getQueryResults。
因此,唯一的方法是列出脚本触发的所有作业并逐一获取结果。
在我看来,这比单独运行查询要复杂得多。但如果你真的需要这样做,解决方案在文档中进行了说明。
【讨论】:
这对我没有帮助,我需要代码方面的帮助。 我阅读了 BigQuery 文档,我的问题是如何做到这一点:“列出脚本触发的所有作业并逐一获取结果”??以上是关于如何从大查询中获取多个查询的所有结果?的主要内容,如果未能解决你的问题,请参考以下文章