如何从大查询中获取多个查询的所有结果?

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 文档,我的问题是如何做到这一点:“列出脚本触发的所有作业并逐一获取结果”??

以上是关于如何从大查询中获取多个查询的所有结果?的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate:如何从具有多个类的查询中获取结果

如何从子查询中的 2 个或多个字段中获取最大值

我有多个 SQL 查询如何存储所有查询结果并以表格形式显示

如何使用单个 SQL 聚合函数查询为同一个聚合函数获取多个结果?

查询Core Data中多个子实体类型的所有对象

如何使用相同的语句和结果集运行多个选择查询? [复制]