我是Google Cloud和BigQuery的新手
我有一个包含2个项目的云实例。一个是Compute Engine项目,另一个是BigQuery项目。我可以从Compute Engine项目中成功获取访问令牌和刷新令牌。但是,当我尝试访问BigQuery项目时,发生以下错误:
xxxx@gmail.com在项目yyyy中没有bigquery.jobs.create权限
我已经在BigQuery中创建了数据集,并将公共数据复制到了每个数据集中。我还确认xxxx@gmail.com是每个数据集的所有者。我能够成功查询数据集。
HKStatisticsCollectionQuery
我已经审查了以下链接,但建议没有帮助。有关如何解决该错误的任何想法?
https://cloud.google.com/bigquery/docs/access-control
Google Big-query api 403-Forbidden Exception
Google API OAuth2, Service Account, "error" : "invalid_grant"
The user does not have bigquery.jobs.create permission in project gdelt-bq
Running queries in BigQuery without being a project User
https://github.com/getredash/redash/issues/1684
The user does not have bigquery.jobs.create permission in project gdelt-bq
Error :service account does not have bigquery.jobs.create permission
尽管该错误不在服务帐户上,但我还查看了: Error :service account does not have bigquery.jobs.create permission
In IAM, the xxxx@gmail.com has the following:
roles/bigquery.user
roles/bigquery.admin
roles/bigquery.owner
roles/bigquery.viewer
谢谢!
答案 0 :(得分:4)
答案 1 :(得分:3)
bigquery.user和bigquery.admin角色都包含bigquery.jobs.create权限,因此两者都足够。
请确保用户xxxx@gmail.com对正在运行作业的项目(yyyy)具有这些权限,该权限可能不同于包含数据本身的项目。
特别是,您可以通过以下方法检查项目yyyy的IAM策略:
https://console.cloud.google.com/iam-admin/iam?project=yyyy
在那里,请确保xxxx@gmail.com具有该项目中的两个角色之一。
答案 2 :(得分:0)
您将要下载的密钥,请确保使用选项卡高级系统设置在Windows 10中设置环境变量GOOGLE_CREDENTIALS_APPLICATION。并在程序中使用相同的键位置路径。
spark.sqlContext.setGcpJsonKeyFile(jsonKeyFile)
// Set up BigQuery project and bucket
spark.sqlContext.setBigQueryProjectId("inductive-cocoa-250507")
// Set up BigQuery dataset location, default is US
spark.sqlContext.setBigQueryDatasetLocation("US")
spark.sqlContext.setBigQueryGcsBucket("bucket-for-practice")
答案 3 :(得分:0)
最多有3个独立的服务帐户。 一个是默认的数据流服务帐户,另一个是控制器服务帐户,然后是您触发作业的用户帐户或服务帐户。
在上述情况下,为触发作业的用户帐户或服务帐户以及具有相同权限的控制器服务帐户提供必需的权限很重要。如果您不使用传递到数据流作业的控制器服务帐户,那么将使用默认的计算帐户及其权限。
答案 4 :(得分:0)
如果您在 A 项目中创建服务帐户,并将此服务帐户作为 IAM Memeber(ex) role:bigquery.admin 添加到 B 项目中。当您在 B 项目上执行插入查询作业时,您必须在 client.query(project=B) 上添加 'project' 参数,或者在创建客户端时,您添加 'proeject' 参数,例如 client = bigquery.Client.from_service_account_json(SERVICE_ACCOUNT_JSON_PATH , project='B')
EX1)
client = bigquery.Client.from_service_account_json(SERVICE_ACCOUNT_JSON_PATH)
job_config = bigquery.QueryJobConfig(dry_run=False, use_query_cache=True)
# Start the query, passing in the extra configuration.
query_job = client.query(
(
"INSERT INTO `{your_project}.{your_dataset}.{your_table}` (name, gender, count) "
"values('test', 'F', 190), ('test', 'F', 190), ('test', 'F', 190) "
),
job_config=job_config,
project='B'
)
EX2)
client = bigquery.Client.from_service_account_json(SERVICE_ACCOUNT_JSON_PATH,project='B')
job_config = bigquery.QueryJobConfig(dry_run=False, use_query_cache=True)
# Start the query, passing in the extra configuration.
query_job = client.query(
(
"INSERT INTO `{your_project}.{your_dataset}.{your_table}` (name, gender, count) "
"values('test', 'F', 190), ('test', 'F', 190), ('test', 'F', 190) "
),
job_config=job_config,
)