我在升级 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,但这仍然没有帮助。
我在任何地方都找不到关于此错误/主题的任何建议,所以我只想分享是否有人遇到同样的事情。
从 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 库文档。
设定即可
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)
分辨率
除了 google-cloud-bigquery 软件包外,我还安装了软件包 google-cloud-bigquery-storage。一旦我使用
卸载了那个pip uninstall google-cloud-bigquery-storage
一切又开始运转了!不幸的是,错误消息并不那么简单,所以需要一些时间才能弄清楚:)