R版BigQuery查询正常运行,Python版报bigquery.readsessions.create权限缺失错误求助
R版BigQuery查询正常运行,Python版报bigquery.readsessions.create权限缺失错误求助
我太懂这种同一个服务账号在R里跑顺风顺水,到Python就踩权限坑的郁闷了!咱们来捋清楚问题出在哪,怎么解决:
问题根源
你的R代码用的bigrquery包,在获取查询结果时默认没用到BigQuery的「读取会话(Read Session)」机制,所以不需要bigquery.readsessions.create权限;但Python的google-cloud-bigquery客户端,在调用to_dataframe()时默认会创建读取会话来优化大数据集的读取流程,这就触发了权限检查,而你的服务账号刚好没这个权限,所以报错。
两种解决办法
办法一:给服务账号补全权限
这是最稳妥的长期解决方案:
- 登录Google Cloud控制台,找到你的项目
project_name; - 进入「IAM与管理员」→「IAM」页面;
- 找到你的服务账号(就是JSON密钥对应的那个账号);
- 点击编辑按钮,添加以下角色二选一:
- 直接加
BigQuery Data Viewer:这个角色包含了查询数据、创建读取会话的所有必要权限,一步到位; - 精细化权限:如果不想给太宽的权限,可以加
BigQuery Session User(专门管读取会话创建),同时确保服务账号已有BigQuery Job User和BigQuery Data Viewer的基础权限;
- 直接加
- 保存后等个几分钟让权限生效,再重新跑Python代码就行。
办法二:修改Python代码,禁用读取会话
如果暂时没法调整权限,可以让客户端跳过读取会话的创建,直接获取结果:
把你原来的结果导出代码:
query_job = client.query(query) results = query_job.result() df = results.to_dataframe()
改成:
# 直接禁用读取会话,获取结果 df = client.query(query).to_dataframe(create_read_session=False)
这样客户端就不会触发bigquery.readsessions.create的权限检查了,和R的逻辑更接近。
额外提醒:代码里的小细节
你代码里的项目ID、表名前后有多余空格(比如project_id = " project_name "、FROM project_name.angel.info ``),虽然这次报错是权限问题,但这些空格可能导致后续其他奇怪的问题,建议赶紧去掉哦!
备注:内容来源于stack exchange,提问作者jwatki8
相关产品推荐
相关产品推荐

