Python BigQuery调用result()正常但to_dataframe()报403权限错误
问题原因
这个权限报错是to_dataframe()的默认数据拉取逻辑触发的,和google-cloud-bigquery主包版本没有直接关系:
- 当本地Python环境安装了
pyarrow和google-cloud-bigquery-storage两个可选依赖时,to_dataframe()会自动调用BigQuery Storage API高速拉取结果,这个接口要求调用方拥有bigquery.readsessions.create权限,就是报错里提到的缺失权限。 - 替换为
result()方法时,走的是BigQuery常规的查询作业结果拉取接口,只需要基础的BigQuery查询、结果读取权限,不需要Storage API相关权限,所以能正常返回RowIterator对象。 - 服务端运行正常是因为服务端环境没有安装上述两个可选依赖,
to_dataframe()会自动回退到常规接口拉取数据,不会触发权限校验;你本地只对齐了google-cloud-bigquery主包版本,没有对齐可选依赖,所以会出现两边同版本代码表现不一致的问题。
可落地的解决方法
根据你的实际需求选任意一种即可:
- 方法1:调用时关闭Storage API,无需修改权限
在to_dataframe()中传入参数显式禁用Storage客户端,会自动走和result()一致的常规拉取通道,直接解决报错:data = client.query('select * from dataset.table').to_dataframe( create_bqstorage_client=False ) - 方法2:补全IAM权限,保留高速下载能力
如果你查询的表数据量较大,需要Storage API的高速下载能力,可以在GCP IAM控制台给当前使用的服务账号绑定BigQuery Storage Read Session Creator角色,或者直接添加bigquery.readsessions.create的自定义权限,配置完成后即可正常调用。 - 方法3:卸载本地的Storage API依赖包
如果你不需要高速下载能力,可以直接卸载触发逻辑的可选依赖,后续调用to_dataframe()会自动回退到常规通道,不会再报权限错误:pip uninstall -y google-cloud-bigquery-storage
内容的提问来源于stack exchange,提问作者Michaela
相关产品推荐
相关产品推荐

