使用 Python 的 BigQuery

Posted

技术标签:

【中文标题】使用 Python 的 BigQuery【英文标题】:BigQuery with Python 【发布时间】:2015-04-01 13:59:36 【问题描述】:

是否可以使用 Python 脚本在 google BigQuery 上重复运行查询?

我想使用 Google BigQuery Platform 查询一个数据集以获取一周的数据,并且我想在一年多的时间内完成此操作。查询数据集 52 次有点太繁琐了。相反,我更愿意编写 Python 脚本(据我所知 Python)。

我希望有人能指出我正确的方向。

【问题讨论】:

A quick Internet search 透露这是可能的...它还在 BigQuery 主页上提到了 Python...不确定您的困惑/问题是什么? cron 作业 + 在 App Engine 上托管的 python 代码?不过,您的问题必须更具体 【参考方案1】:

BigQuery 为多种语言提供客户端库 - 请参阅 https://cloud.google.com/bigquery/client-libraries - 特别是 Python,文档位于 https://developers.google.com/resources/api-libraries/documentation/bigquery/v2/python/latest/?_ga=1.176926572.834714677.1415848949(您需要点击超链接才能理解文档)。

https://cloud.google.com/bigquery/bigquery-api-quickstart 提供了一个命令行程序示例,使用 Java 或 Python 编写,该程序使用 Google BigQuery API 对可用的示例数据集之一运行查询并显示结果。导入并设置一些常量后,Python 脚本归结为

  storage = Storage('bigquery_credentials.dat')
  credentials = storage.get()

  if credentials is None or credentials.invalid:
      # Run oauth2 flow with default arguments.
      credentials = tools.run_flow(FLOW, storage, tools.argparser.parse_args([]))

  http = httplib2.Http()
  http = credentials.authorize(http)

  bigquery_service = build('bigquery', 'v2', http=http)

  try:
    query_request = bigquery_service.jobs()
    query_data = 'query':'SELECT TOP( title, 10) as title, COUNT(*) as revision_count FROM [publicdata:samples.wikipedia] WHERE wp_namespace = 0;'

    query_response = query_request.query(projectId=PROJECT_NUMBER,
                                         body=query_data).execute()
    print 'Query Results:'
    for row in query_response['rows']:
      result_row = []
      for field in row['f']:
        result_row.append(field['v'])
      print ('\t').join(result_row)

  except HttpError as err:
    print 'Error:', pprint.pprint(err.content)

  except AccessTokenRefreshError:
    print ("Credentials have been revoked or expired, please re-run"
           "the application to re-authorize")

如您所见,只有 30 行,主要涉及获取和检查授权以及处理错误。除去这些考虑,“核心”部分实际上只是这些行的一半:

    bigquery_service = build('bigquery', 'v2', http=http)
    query_request = bigquery_service.jobs()
    query_data = 'query':'SELECT TOP( title, 10) as title, COUNT(*) as revision_count FROM [publicdata:samples.wikipedia] WHERE wp_namespace = 0;'

    query_response = query_request.query(projectId=PROJECT_NUMBER,
                                         body=query_data).execute()
    print 'Query Results:'
    for row in query_response['rows']:
      result_row = []
      for field in row['f']:
        result_row.append(field['v'])
      print ('\t').join(result_row)

【讨论】:

【参考方案2】:

您可以将 google 数据流用于 python,如果它是一次性的,可以从您的终端或等效设备运行它。或者,您可以在 appenginecron 中有一个 shell 脚本,该脚本循环 52 次代码以获取您的数据。谷歌数据流调度。

【讨论】:

以上是关于使用 Python 的 BigQuery的主要内容,如果未能解决你的问题,请参考以下文章

python基础之从认识python到python的使用

python使用独立空间

python学习-python变量的命名和使用

python模块的使用python的时间处理

python的使用

在python使用SSL(HTTPS)