使用 python 从 bigquery 调用外部表

Posted

技术标签:

【中文标题】使用 python 从 bigquery 调用外部表【英文标题】:Calling external table from bigquery with python 【发布时间】:2020-09-10 11:03:30 【问题描述】:

当我尝试访问外部表的数据时,出现如下错误。我无法解决这个问题。以下是有关情况的详细信息;

google.api_core.exceptions.NotFound:404 未找到:文件 /gdrive/id/id123456id

PS:id123456id 是一个虚拟 id。

ID 为 id123456 的文件存在于我的 Google 云端硬盘中。查找此 ID 的 Bigquery 表。

bq_test.json -> 服务帐户凭据的 JSON 文件。此服务帐号具有这些角色;

BigQuery 数据编辑器 BigQuery 数据所有者 BigQuery 数据查看器 BigQuery 用户 所有者

这是我的代码块:

from google.cloud import bigquery
from google.oauth2.service_account import Credentials

scopes = (
        'https://www.googleapis.com/auth/bigquery',
        'https://www.googleapis.com/auth/cloud-platform',
        'https://www.googleapis.com/auth/drive'
)
credentials = Credentials.from_service_account_file('bq_test.json')
credentials = credentials.with_scopes(scopes)
client = bigquery.Client(credentials=credentials)

QUERY = (
        """SELECT * FROM
            `project_name.dataset_name.ext_table`
            LIMIT 5"""
        )
query_job = client.query(QUERY)
rows = query_job.result()

for row in rows:
    print(row.name)

【问题讨论】:

听起来服务帐户没有访问权限。 @DaImTo 如何授予访问权限?我在角色列表中找不到 drive.readonly 或其他内容。 【参考方案1】:

我解决了如下问题;

转到https://console.cloud.google.com/iam-admin/iam?project=PROJECT_ID 获取服务帐户邮件值。 (例如 bq_test@PROJECT_ID.iam.gserviceaccount.com) 转到https://drive.google.com并找到相关文件。 (id = id123456) 右键单击并选择共享 粘贴上面的邮件值。 (bq_test@PROJECT_ID.iam.gserviceaccount.com) 选择只读或任何您需要的。

这个流程在我的情况下提供了解决方案。

【讨论】:

以上是关于使用 python 从 bigquery 调用外部表的主要内容,如果未能解决你的问题,请参考以下文章

从外部表读取与加载数据并在 Bigquery 中读取

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

在 Python 中使用 BigQuery + Pandas 时无法调用 RowIterator 对象

BigQuery 能否在 Google Cloud Storage 中基于 CSV 文件的外部表中使用通配符?

如何使用从外部脚本调用的回调发送信号?

创建按一/多列分区的 BigQuery 外部表