在 Python 中运行 BigQuery SQL 查询,如何进行身份验证?

Posted

技术标签:

【中文标题】在 Python 中运行 BigQuery SQL 查询,如何进行身份验证?【英文标题】:Running a BigQuery SQL query in Python, how to authenticate? 【发布时间】:2018-01-12 11:55:49 【问题描述】:

我想使用 Python 对 BigQuery 运行 SQL 查询,我是这方面的初学者。我已阅读“使用 API 创建一个简单的应用程序”页面 (https://cloud.google.com/bigquery/create-simple-app-api#bigquery-simple-app-build-service-python) 并获得如下代码:

from google.cloud import bigquery

client = bigquery.Client()

query_job = client.query("""
    #standardSQL
    SELECT date, totals.visits AS visits
    FROM `myproject.mydataset.ga_sessions_20180111`
    GROUP BY date
    """)

results = query_job.result()  # Waits for job to complete.

for row in results:
    print(": ".format(row.title, row.unique_words))

当我运行它时,我得到了错误:OSError: Project was not passed and could not be determined from the environment.

阅读此内容,我认为该问题与client = bigquery.Client() 的身份验证有关 - 有人可以简单地向我解释这是如何工作的吗?如果我已经登录,它会查找我的身份验证详细信息吗?如果我拥有多个项目的权限,我是否需要指定我正在使用哪一个?

【问题讨论】:

你是否已经创建了服务帐号json? 不,我没有 - 我需要创建一个服务帐户,我可以不使用我的个人用户凭据吗? 【参考方案1】:

为了向任何 GCP API 进行身份验证,建议使用service account credential,文档将教您如何创建和下载一个。

在这一步之后,你应该有一个如下所示的 json 文件:


 "type": "service_account",
 "project_id": "your project",
 "private_key_id": "your private key id",
 "private_key": "private key",
 "client_email": "email",
 "client_id": "client id",
 "auth_uri": "https://accounts.google.com/o/oauth2/auth",
 "token_uri": "https://accounts.google.com/o/oauth2/token",
 "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
 "client_x509_cert_url":  "https://www.googleapis.com/robot/v1/metadata/x509/email_id"

之后,您可以将文件路径导出到操作系统中的env 变量,如下所示:

export GOOGLE_APPLICATION_CREDENTIALS=/path/to/key.json

或者您可以在自己的脚本中直接使用 json 文件构建客户端:

import google.cloud.bigquery as bq
client = bq.Client.from_service_account_json("path/to/key.json")

project_id 也会自动为您处理(给定您创建 json 文件的项目)。

您询问了有关使用您自己的用户凭据的问题,我不确定如何使用这些凭据进行身份验证,但仍然不建议这样做,您必须管理 google.auth 并手动构建 OAuth2 步骤,所有这些都已经在服务帐户中自动为您完成。

【讨论】:

【参考方案2】:

对,您需要指定您将使用的项目。根据此 Google Colab 笔记本中的说明:https://colab.research.google.com/notebooks/bigquery.ipynb:

您可以声明您的 Google Cloud Platform 项目 ID: project_id = '[your project ID]'

然后,您可以将此变量添加到客户端对象创建中: client = bigquery.Client(project=project_id)

【讨论】:

【参考方案3】:

pythonbq 包使用非常简单,是一个很好的起点。它使用 python-gbq。

要开始使用,您需要为外部应用程序访问生成一个 BQ json 密钥。您可以生成您的密钥here。

您的代码如下所示:

from pythonbq import pythonbq

myProject=pythonbq(
  bq_key_path='path/to/bq/key.json',
  project_id='myproject'
)
SQL_CODE="""
SELECT date, totals.visits AS visits
    FROM `myproject.mydataset.ga_sessions_20180111`
    GROUP BY date
"""
output=myProject.query(sql=SQL_CODE)

【讨论】:

以上是关于在 Python 中运行 BigQuery SQL 查询,如何进行身份验证?的主要内容,如果未能解决你的问题,请参考以下文章

无法在 python 中对 bigquery 运行标准 SQL 查询

Google BigQuery 从 Python 脚本执行 SQL 文件

Python gcloud BigQuery 中的 run_async_query 使用标准 SQL 而不是旧版 SQL

如何使用调用 UDF 的 Python 脚本来使用 BigQuery API

在 BigQuery UDF 中运行 SQL,可能是递归的

如何在 BigQuery 中最小化每次 SQL 查询执行的成本