bigquery.client.query()可以查看2个结果集吗?

Kis*_*mar 3 python python-3.x google-bigquery

我想使用 bigquery API 运行 2 个 Select 参数。例如,如果我运行以下查询

SELECT 1;
SELECT 2;
Run Code Online (Sandbox Code Playgroud)

当我使用以下 python 脚本运行它时,我只获得第二个查询的结果。

def runquery();
    bqclient = bigquery.client()
    query = """ SELECT 1; 
                SELECT 2;"""
    query_job = bqclient.query(query)
    data = query_job.result()
    rows = list(data)
    print(rows)
Run Code Online (Sandbox Code Playgroud)

结果:

[Row((2,), {'f0_': 0})]
Run Code Online (Sandbox Code Playgroud)

但是,如果我在 bigquery 查询编辑器中运行相同的查询,我将能够查看两个结果。

来自 BQ 查询编辑器的图像

我如何才能同时获取 Bigquery API 结果集中的查询结果?我需要将 jobconfig 添加到 client.query() 语句吗?

sho*_*man 6

这是一个运行脚本的快速示例。在此示例中,您的父作业属于脚本类型,它由两个都是 select 语句的子作业组成。父级完成后,您可以调用list_jobs父级过滤器来查找子级作业并询问它们的结果。子作业不会嵌套,因此您只需担心父作业下一级的子作业即可。

def multi_statement_script():

    from google.cloud import bigquery

    bqclient = bigquery.Client()
    query = """ SELECT 1; 
                SELECT 2;
            """

    parent_query = bqclient.query(query)
    # wait for parent job to finish (which completes when all children are done)
    parent_query.result()

    print("parent job {}".format(parent_query.job_id))
    children = bqclient.list_jobs(parent_job=parent_query.job_id)

    # note the jobs are enumerated newest->oldest, so the reverse 
    # ordering specified in the script
    for child in children:
        print("job {}".format(child.job_id))
        rows = list(child.result())
        print(rows)
Run Code Online (Sandbox Code Playgroud)