如何使用 bigquery 服务对象

Posted

技术标签:

【中文标题】如何使用 bigquery 服务对象【英文标题】:How to use the bigquery service object 【发布时间】:2017-08-07 20:48:43 【问题描述】:

我正在尝试学习如何使用服务帐号从 Python 调用 BigQuery API。我正在关注docs here。这个 URL 实际上有接近我坚持的那个位的书签。我已经到了这一行:

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

并且缺少错误消息和属性列表似乎表明它已经工作,但我被困在如何处理它上。我已经阅读了我应该如何处理它,但我的尝试是错误的,我找不到相关文档来解除对自己的阻止。或者我找到了正确的文档,但不明白如何处理它。

通过扫描 GQB 文档,这是我尝试过的:

sql ="""
#standardSQL
SELECT corpus AS title, COUNT(*) AS unique_words
FROM `publicdata.samples.shakespeare`
GROUP BY title
ORDER BY unique_words DESC
LIMIT 10
"""

collection = bigquery.jobs()
request = collection.query(
    kind="bigquery#queryRequest",
    query=sql,
    useQueryCache=True,
    useLegacySql=False
)

response = request.execute()

这是我从GBQ API documentation 和上面列出的文档中得出的。

这给出了:

Traceback (most recent call last):
  File "/Users/.../gbq.py", line 37, in <module>
    useLegacySql=False
  File "/anaconda/lib/python3.6/site-packages/googleapiclient/discovery.py", line 717, in method
    raise TypeError('Got an unexpected keyword argument "%s"' % name)
TypeError: Got an unexpected keyword argument "kind"

好吧,这显然是错误的。我怀疑如果我在使用 API 方面更有经验,这将是显而易见的,但我似乎无法将其带回家。请有人指出我正确的方向,有没有我错过的指南?

【问题讨论】:

但该错误表明您正在执行collection.query(....sql=sql...),而不是代码中显示的query=sql 感谢@DanielRoseman 指出这一点——我已经尝试了一些方法。我将进行编辑以使其保持一致。 【参考方案1】:

我建议您使用 BigQuery 的官方 Python API Client,因为它已经为您自动处理所有这些连接和设置。

运行查询最终变得非常简单。示例:

import uuid
import os
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'path/to/your/jsonscrets.json'

from google.cloud.bigquery import Client
bqc = Client()

sql ="""
#standardSQL
SELECT corpus AS title, COUNT(*) AS unique_words
FROM `publicdata.samples.shakespeare`
GROUP BY title
ORDER BY unique_words DESC
LIMIT 10
"""

job = bqc.run_async_query(str(uuid.uuid4()), sql)
job.use_legacy_sql = False
job.begin()

job_result = job.result()
data = list(job_result.fetch_data())

【讨论】:

很棒 - 正是我想要的,而且更简单。非常感谢!

以上是关于如何使用 bigquery 服务对象的主要内容,如果未能解决你的问题,请参考以下文章

创建存根 bigquery 表

如何使用 Bigquery 在 Google Bigquery 中进行身份验证,而无需使用服务帐户进行用户输入

如何使用服务使用启用 Bigquery API?

如何使用 Python + 服务帐户创建 BigQuery 数据传输?

如何使用服务帐户和 bigquery 包进行身份验证?

如何使用服务帐户确定 Google BigQuery 作业的状态?