将BigQuery脚本的结果返回到Python客户端
截至2019年秋季,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;
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