如何在Python中连接Google BigQuery两个不同项目实现跨项目关联查询
跨BigQuery双项目执行关联查询的实现方案
方案1:单客户端授权跨项目访问(优先推荐)
- 操作前提:为其中一个服务账号(例如project1对应的服务账号)开通第二个项目的访问权限:进入project2的IAM配置页,添加第一个服务账号的邮箱地址,为其分配
BigQuery Data Viewer(目标数据集读权限)和BigQuery Job User(任务执行权限)即可。 - 优势:关联计算直接在BigQuery服务端完成,不需要全量拉取数据到本地,性能高、资源消耗低,适合所有数据量场景。
代码示例:
from google.cloud import bigquery from google.oauth2 import service_account # 仅使用已授权跨项目访问的单组凭证即可 credentials = service_account.Credentials.from_service_account_file('C:\\Users\\zuser\\Desktop\\JSON_Keys\\firstjsonkey.json') client = bigquery.Client(credentials=credentials, project="project1") # SQL语句中使用「项目ID.数据集名.表名」的全路径格式指代两个项目的表,直接写关联逻辑 cross_join_sql = """ SELECT a.field1, a.field2, b.field3, b.field4 FROM `project1.数据集名.表1` a INNER JOIN `project2.数据集名.表2` b ON a.join_key = b.join_key """ # 直接执行查询即可返回关联后的结果 sales = client.query(cross_join_sql).to_dataframe()
方案2:双客户端拉取数据后本地内存关联
如果无法配置跨项目服务账号权限,可以选择分别拉取两个项目的表数据到本地,用pandas完成关联,仅适合小数据量场景。
代码示例:
# 分别用两个客户端拉取需要关联的表数据 df_project1 = client.query("SELECT * FROM `project1.数据集名.表1`").to_dataframe() df_project2 = client_2ndproject.query("SELECT * FROM `project2.数据集名.表2`").to_dataframe() # 用pandas的merge方法完成本地关联 sales = df_project1.merge(df_project2, on="关联键字段名", how="inner")
- 注意:该方案需要将两张表的全量数据传输到本地,数据量过大时会出现内存不足、运行耗时过长的问题。
内容的提问来源于stack exchange,提问作者CIHAnalytics
相关产品推荐
相关产品推荐

