我有一个用userA帐户在Google Cloud中定义的bigQuery数据集,并且我希望属于同一组的同事userB能够查看我定义的数据集。使用bq命令行界面,userB可以看到项目,但不能看到数据集。如何使用Python脚本与userB共享userA创建的数据集?
答案 0 :(得分:0)
使用Python客户端库的示例。改编自here,但添加了一个get_dataset
调用以获取现有数据集的当前ACL策略:
from google.cloud import bigquery
project_id = "PROJECT_ID"
dataset_id = "DATASET_NAME"
group_name= "google-group-name@google.com"
role = "READER"
client = bigquery.Client(project=project_id)
dataset_info = client.get_dataset(client.dataset(dataset_id))
access_entries = dataset_info.access_entries
access_entries.append(
bigquery.AccessEntry(role, "groupByEmail", group_name)
)
dataset_info.access_entries = access_entries
dataset_info = client.update_dataset(
dataset_info, ['access_entries'])
另一种实现方法是使用Google Python API客户端以及get和patch方法。首先,我们检索现有的数据集ACL,将组作为READER
添加到响应中并修补数据集元数据:
from oauth2client.client import GoogleCredentials
from googleapiclient import discovery
project_id="PROJECT_ID"
dataset_id="DATASET_NAME"
group_name="google-group-name@google.com"
role="READER"
credentials = GoogleCredentials.get_application_default()
bq = discovery.build("bigquery", "v2", credentials=credentials)
response = bq.datasets().get(projectId=project_id, datasetId=dataset_id).execute()
response['access'].append({u'role': u'{}'.format(role), u'groupByEmail': u'{}'.format(group_name)})
bq.datasets().patch(projectId=project_id, datasetId=dataset_id, body=response).execute()
相应地替换project_id
,dataset_id
,group_name
和role
变量。
使用的版本:
$ pip freeze | grep -E 'bigquery|api-python'
google-api-python-client==1.7.7
google-cloud-bigquery==1.8.1
答案 1 :(得分:0)
您可能会遇到的另一件事是,您必须在BigQuery的数据集级别授予访问权限。根据您在云平台和BigQuery中设置用户角色的方式,可能需要使服务帐户直接访问Bigquery数据集。
要执行此操作,请进入BigQuery,将鼠标悬停在数据集上,然后单击向下箭头,然后选择“共享数据集”。将打开一个模式,您可以在其中指定要与之共享数据集并控制其访问权限的电子邮件地址和服务帐户。
让我知道我的说明是否过于混乱,我将上传一些图片,确切说明如何执行此操作。
祝你好运!