Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将BigQuery脚本的结果返回到Python客户端_Python_Python 3.x_Google Bigquery - Fatal编程技术网

将BigQuery脚本的结果返回到Python客户端

将BigQuery脚本的结果返回到Python客户端,python,python-3.x,google-bigquery,Python,Python 3.x,Google Bigquery,截至2019年秋季,BigQuery支持,这是非常好的。我不知道的是,是否能够利用这个新功能 例如,运行以下Python代码: client = bigquery.Client() QUERY = """ BEGIN CREATE OR REPLACE TEMP TABLE t0 AS SELECT * FROM my_dataset.my_table WHERE foo < 1; SELECT SUM(bar) AS bar_sum FROM t0;

截至2019年秋季,BigQuery支持,这是非常好的。我不知道的是,是否能够利用这个新功能

例如,运行以下Python代码:

client = bigquery.Client()
QUERY = """
BEGIN
    CREATE OR REPLACE TEMP TABLE t0 AS
        SELECT * FROM my_dataset.my_table WHERE foo < 1;

    SELECT SUM(bar) AS bar_sum FROM t0;

    DROP TABLE IF EXISTS t0;
END;
"""

query_job = client.query(QUERY)
rows = query_job.result()
client=bigquery.client()
QUERY=”“”
开始
根据需要创建或替换临时表t0
从my_dataset.my_表中选择*,其中foo<1;
从t0中选择总和(bar)作为bar_SUM;
如果存在,则删除表t0;
结束;
"""
query\u job=client.query(查询)
行=查询作业。结果()
。。。返回一个
google.cloud.bigquery.table.\u EmptyRowIterator
对象,即使我能够看到SQL脚本中的语句已从bigquery的web UI成功运行


如何将此标准SQL脚本中SELECT语句的结果返回到Python客户端?

支持此操作,但您需要考虑以下几点:

脚本在BigQuery中使用jobs.insert执行,类似于任何 其他查询,将多语句脚本指定为查询 文本。当脚本执行时,会出现其他作业,称为子作业, 为脚本中的每个语句创建。你可以列举 通过调用jobs.list,传入脚本的 作业ID作为parentJobId参数

在脚本上调用jobs.getQueryResults时,它将返回 查询要在中执行的最后一条SELECT、DML或DDL语句的结果 脚本,如果上面的语句都没有,则没有查询结果 执行。要获取脚本中所有语句的结果, 枚举子作业并调用每个子作业上的jobs.getQueryResults 他们

例如,我修改了脚本以查询公共表:
bigquery public data.london\u bicycles.cycle\u stations
。它运行三个子作业:

其中,最后一行将删除表,并且不返回任何行

这就是为什么,如果我运行Python文件,我会得到类似
的东西

我们想要的是中间查询的输出结果

一个快速测试是注释掉
DROP
语句,然后在行上迭代以获得
sum=6676
的结果。那么,如果我们想要中间结果呢?与前面引用的文档一样,答案是调用脚本作业ID并将其作为
parentJobId
参数传递,以获取子作业ID:

客户端中作业的
。列出作业(父作业=查询作业。作业id):
打印(“作业ID:{},语句类型:{}”。格式(Job.Job\u ID,Job.Statement\u Type))
我们使用该方法并检查:

作业ID:script\u Job\u 80e…296\u 2,语句类型:DROP\u TABLE 作业ID:script\u Job\u 9a0…7fd\u 1,语句类型:SELECT 作业ID:script\u Job\u 113…e13\u 0,语句类型:CREATE\u TABLE\u AS\u SELECT 请注意,后缀(0、1、2)表示执行顺序,但我们可以在检索结果之前添加双重检查以验证作业实际上是
SELECT
语句:

从google.cloud导入bigquery
client=bigquery.client()
QUERY=”“”
开始
根据需要创建或替换临时表t0
从“bigquery公共数据.伦敦自行车.自行车站”中选择名称,自行车计数>10;
从t0中选择总和(自行车计数)作为总自行车数;
如果存在,则删除表t0;
结束;
"""
query\u job=client.query(查询)
query_job.result()
对于client.list_作业中的作业(父作业=查询_作业.作业id):#列出所有子作业
#打印(“作业ID:{},语句类型:{}”。格式(Job.Job\u ID,Job.Statement\u Type))
如果job.statement_type==“选择”:#仅打印所需的作业输出
行=作业。结果()
对于行中的行:
打印(“总和={}”。格式(第[“总计”]行)
输出:

sum=6676