如何使用 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 在 Google Bigquery 中进行身份验证,而无需使用服务帐户进行用户输入