访问由电子表格支持的 bigquery 表时遇到 BadRequest/ForbiddenException

Posted

技术标签:

【中文标题】访问由电子表格支持的 bigquery 表时遇到 BadRequest/ForbiddenException【英文标题】:Hitting a BadRequest/ForbiddenException when accessing a bigquery table backed by a spreadsheet 【发布时间】:2019-10-31 14:42:52 【问题描述】:

我有一个大查询表,其数据源是谷歌电子表格。我正在尝试使用 python 访问此表,但遇到以下错误 google.api_core.exceptions.BadRequest: 400 Error while reading table: datset.table, error message: Failed to read the spreadsheet. Errors: com.google.apps.framework.request.ForbiddenException: Permission denied [S]#RITZ#369137407806#topTeRwnQcmrdMeVQ98ZkGA

我的应用通过具有 BigQuery 管理员角色的 ServiceAccount JSON 令牌进行身份验证,以下是我的客户端的创建方式:

from google.oauth2.service_account import Credentials

import os

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(os.environ['GOOGLE_APPLICATION_CREDENTIALS'], scopes=scopes)

client = bigquery.Client(credentials=credentials)

我对严格的 BigQuery 表没有任何问题,但我不明白我在这里做错了什么。感谢您的帮助。

【问题讨论】:

【参考方案1】:
# from google.cloud import bigquery
# client = bigquery.Client()
# dataset_id = 'my_dataset'

dataset_ref = client.dataset(dataset_id)
job_config = bigquery.LoadJobConfig()
job_config.schema = [
   bigquery.SchemaField("name", "STRING"),
   bigquery.SchemaField("post_abbr", "STRING"),
]
job_config.source_format = bigquery.SourceFormat.NEWLINE_DELIMITED_JSON
uri = "gs://cloud-samples-data/bigquery/us-states/us-states.json"

load_job = client.load_table_from_uri(
             uri,
             dataset_ref.table("us_states"),
             location="US",  # Location must match that of the destination dataset.
             job_config=job_config,
            )  # API request
print("Starting job ".format(load_job.job_id))

load_job.result()  # Waits for table load to complete.
print("Job finished.")

destination_table = client.get_table(dataset_ref.table("us_states"))
print("Loaded  rows.".format(destination_table.num_rows))

我从谷歌获得的上述代码对我来说很好用。他们确实有其他语言的代码检查这个https://cloud.google.com/bigquery/docs/loading-data-cloud-storage-json

【讨论】:

谢谢,但我正在尝试查询数据源为电子表格的表,而不是将数据加载到表中。 这三个步骤你做到了吗? ***.com/questions/40731823/… 是的,我有。 Drive API 已启用,ServiceAccount 电子邮件具有对电子表格的读取权限,并且在创建客户端时请求驱动范围,如上面的代码所示。【参考方案2】:

好的,我终于明白了。我以为我已授予对服务帐户电子邮件的访问权限,但它似乎不起作用,因为我不是此文件的所有者。使用高级访问请求也不会向所有者发送请求。

所以我要求所有者向服务帐户电子邮件发送邀请,现在它工作正常。

【讨论】:

以上是关于访问由电子表格支持的 bigquery 表时遇到 BadRequest/ForbiddenException的主要内容,如果未能解决你的问题,请参考以下文章

新 Google 电子表格的 BigQuery 访问权限

Google Dataflow - 由GoogleSheets支持的BigQuery工作

从 BigQuery 格式化时间戳到 Google 电子表格

无法在 Google 电子表格中运行 BigQuery.Jobs.query

如何将 52.4 MB 的 XLSX 电子表格加载到 BigQuery 中?

当没有数据上传到 GCP 中的 BigQuery 表时创建警报