python - 如何使用 Google BigQuery python API 获得超过 100,000 个响应结果?

标签 python google-app-engine google-bigquery

现在,我使用此脚本通过 python API 请求 Big Query:

import argparse
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from oauth2client.client import GoogleCredentials
credentials = GoogleCredentials.get_application_default()
bigquery_service = build('bigquery', 'v2', credentials=credentials)

def request(query):
    query_request = bigquery_service.jobs()
    query_data = {'query':query, 'timeoutMs':100000}
    query_response = query_request.query(projectId=project, body=query_data).execute()
    return query_response

query = """
select domain
from 
[logs.compressed_v40_20170313]
limit 150000"""

respond = request(query)

我得到了结果:

print respond['totalRows']  # total number of lines in respond 
u'150000'

print len(respond['raws])  # actual number of lines
100000

问题:如何接收剩余的50,000行?

最佳答案

要在第一页结果之后获取更多结果,您需要调用 getQueryResults .

就您而言,您需要从 query 获取作业 ID 和页面 token 回应。

query_response = query_request.query(projectId=project, body=query_data).execute()
page_token = query_response['pageToken']
job_id = query_response['jobReference']['jobId']
next_page = bigquery_service.jobs().getQueryResults(
    projectId=project, jobId=job_id, pageToken=page_token)

继续循环,直到获得所有查询结果。

注意:对查询的调用可能会超时,但查询仍将在后台运行。我们建议您创建显式作业 ID 并手动插入作业,而不是使用查询方法。

请参阅"async" query sample 。注意:这不是正确的名称,因为此示例确实等待查询完成。

关于python - 如何使用 Google BigQuery python API 获得超过 100,000 个响应结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42982018/

相关文章:

python - 解释这个 lambda

python - 如何使用 format() 格式化字典键和值

java - 如何将自定义对象传递到应用程序引擎端点

google-analytics - BigQuery 与 Google Analytics 报告中的总 session 数

r - HTTP/2 帧层流错误 : bigrquery commands error in R studio but not in Base R

python - 未找到 generate_presigned_post 的 BotoCore/Boto3 Stubber 操作

python - 尝试使用 zeep 连接到 Netsuite 时出错

mysql - Google Cloud SQL 添加授权网络

google-app-engine - 为什么 Google 应用引擎将 URL、电话号码等识别为特殊数据类型?

google-cloud-platform - 数据流 ReadFromBigQuery 转换 - 如何配置临时表的位置