Python 中的 Google BigQuery 查询在使用 result() 时有效,但在使用 to_dataframe() 时出现权限问题

问题描述 投票:0回答:3

我在升级 pip 包和返回查询结果的 bigquery 连接器后遇到问题,突然停止工作并出现以下错误消息

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

credentials = service_account.Credentials.from_service_account_file('path/to/file', scopes=['https://www.googleapis.com/auth/cloud-platform',
    'https://www.googleapis.com/auth/drive',
    'https://www.googleapis.com/auth/bigquery'
])

client = bigquery.Client(credentials=credentials)
data = client.query('select * from dataset.table').to_dataframe()

PermissionDenied: 403 请求失败:用户没有权限 bigquery.readsessions.create' 权限

但是!如果您将代码切换为

data = client.query('select * from dataset.table').result()

(数据帧 -> 结果)您收到了 RowIterator 格式的数据并且能够正确读取它们。

使用具有相同凭据的 to_dataframe 的相同脚本正在服务器上运行。因此我将我的bigquery包设置为相同的版本2.28.0,但这仍然没有帮助。

我在任何地方都找不到关于此错误/主题的任何建议,所以我只想分享是否有人遇到同样的事情。

python google-bigquery google-cloud-storage
3个回答
4
投票

从 bigquery 接收数据的方式有多种。与其他选项相比,对于较大的结果集,使用 BQ Storage API 被认为更有效:

BigQuery Storage Read API 提供了第三个选项,它比之前的选项有所改进。当您使用存储读取 API 时,结构化数据会以二进制序列化格式通过线路发送。这允许多个消费者之间的额外并行性以获得一组结果

Python BQ 库内部决定是否可以使用 BQ Storage API。 对于 result 方法,它在内部使用传统的 tabledata.list 方法,而 to_dataframe 方法在安装了相应的包的情况下使用 BQ Storage API。

但是,使用 BQ Storage API 要求您分别拥有 bigquery.readSessionUser 角色和 readsessions.create 权限,而在您的情况下,这似乎是缺乏的。

通过卸载 google-cloud-bigquery-storage,google-cloud-bigquery 包将回退到 list 方法。因此,通过卸载此软件包,您可以解决缺乏权限的问题。

有关详细信息,请参阅 BQ Python 库文档


4
投票

设定即可
create_bqstorage_client=False

from google.cloud import bigquery
import os
client = bigquery.Client()
query_job = client.query(query)
df = query_job.result().to_dataframe(create_bqstorage_client=False)

2
投票

分辨率

除了 google-cloud-bigquery 软件包外,我还安装了软件包 google-cloud-bigquery-storage。一旦我使用

卸载了那个
pip uninstall google-cloud-bigquery-storage

一切又开始运转了!不幸的是,错误消息并不那么简单,所以需要一些时间才能弄清楚:)

© www.soinside.com 2019 - 2024. All rights reserved.