从共享数据集中提取 BigQuery 数据
Extracting BigQuery Data From a Shared Dataset
是否可以使用客户端 APIs (python) 从共享数据集(我只有查看权限)中提取数据(到 google 云存储) ?
我可以使用 Web 浏览器手动执行此操作,但无法使用 APIs 使其正常工作。
我已经为 MyProject 创建了一个项目 (MyProject) 和一个服务帐户,以便在使用 API 创建服务时用作凭据。此帐户对共享数据集 (MySharedDataset) 具有查看权限,对我的 google 云存储桶具有写入权限。如果我尝试 运行 我自己项目中的一项工作以从共享项目中提取数据:
job_data = {
'jobReference': {
'projectId': myProjectId,
'jobId': str(uuid.uuid4())
},
'configuration': {
'extract': {
'sourceTable': {
'projectId': sharedProjectId,
'datasetId': sharedDatasetId,
'tableId': sharedTableId,
},
'destinationUris': [cloud_storage_path],
'destinationFormat': 'AVRO'
}
}
}
我收到错误:
googleapiclient.errors.HttpError: https://www.googleapis.com/bigquery/v2/projects/sharedProjectId/jobs?alt=json
returned "Value 'myProjectId' in content does not agree with value
sharedProjectId'. This can happen when a value set through a parameter
is inconsistent with a value set in the request.">
在 jobReference 和 sourceTable 中使用 sharedProjectId 我得到:
googleapiclient.errors.HttpError: https://www.googleapis.com/bigquery/v2/projects/sharedProjectId/jobs?alt=json
returned "Access Denied: Job myJobId: The user myServiceAccountEmail
does not have permission to run a job in project sharedProjectId">
对这两个作业使用 myProjectId 立即返回 'DONE' 状态并且没有错误,但没有导出任何内容。我的 GCS 桶是空的。
如果使用 API 确实无法做到这一点,是否还有另一个 method/tool 可用于自动从共享数据集中提取数据?
* 更新 *
在我的 GA 登录下使用 API 资源管理器 运行ning 效果很好。在我的代码中,我使用以下方法:
service.jobs().insert(projectId=myProjectId, body=job_data).execute()
并删除了包含 projectId
的 jobReference 对象
job_data = {
'configuration': {
'extract': {
'sourceTable': {
'projectId': sharedProjectId,
'datasetId': sharedDatasetId,
'tableId': sharedTableId,
},
'destinationUris': [cloud_storage_path],
'destinationFormat': 'AVRO'
}
}
}
但是这个returns错误
Access Denied: Table sharedProjectId:sharedDatasetId.sharedTableId: The user 'serviceAccountEmail' does not have permission to export a table in
dataset sharedProjectId:sharedDatasetId
我的服务帐户现在是共享数据集的所有者并且对 MyProject 具有编辑权限,在其他地方需要设置权限或者是否可以使用 python API 使用我的GA 登录凭据而不是服务帐户?
* 更新 *
终于成功了。如何?确保服务帐户具有查看数据集的权限(如果您无权自行检查,而有人告诉您可以,请他们给您双倍 check/send 截图!)
在尝试重现问题后,我 运行 遇到了解析错误。
我在开发者控制台 [2] 上玩过 API 并且它起作用了。
我确实注意到,下面的请求代码与网站上的文档格式不同,因为它使用单引号而不是双引号。
这是我 运行 让它工作的代码。
{
'configuration': {
'extract': {
'sourceTable': {
'projectId': "sharedProjectID",
'datasetId': "sharedDataSetID",
'tableId': "sharedTableID"
},
'destinationUri': "gs://myBucket/myFile.csv"
}
}
}
HTTP 请求
POST https://www.googleapis.com/bigquery/v2/projects/myProjectId/jobs
如果您仍然 运行 遇到问题,您可以尝试网站 [2] 上的 jobs.insert API 或尝试 bq 命令工具 [3] .
下面的命令可以做同样的事情:
bq 提取 sharedProjectId:sharedDataSetId.sharedTableId gs://myBucket/myFile.csv
希望这对您有所帮助。
[2] https://cloud.google.com/bigquery/docs/reference/v2/jobs/insert
确保服务帐户具有查看数据集的权限(如果您无权自行检查,而有人告诉您有权限,请让他们给您双倍 check/send 截图! )
是否可以使用客户端 APIs (python) 从共享数据集(我只有查看权限)中提取数据(到 google 云存储) ?
我可以使用 Web 浏览器手动执行此操作,但无法使用 APIs 使其正常工作。
我已经为 MyProject 创建了一个项目 (MyProject) 和一个服务帐户,以便在使用 API 创建服务时用作凭据。此帐户对共享数据集 (MySharedDataset) 具有查看权限,对我的 google 云存储桶具有写入权限。如果我尝试 运行 我自己项目中的一项工作以从共享项目中提取数据:
job_data = {
'jobReference': {
'projectId': myProjectId,
'jobId': str(uuid.uuid4())
},
'configuration': {
'extract': {
'sourceTable': {
'projectId': sharedProjectId,
'datasetId': sharedDatasetId,
'tableId': sharedTableId,
},
'destinationUris': [cloud_storage_path],
'destinationFormat': 'AVRO'
}
}
}
我收到错误:
googleapiclient.errors.HttpError: https://www.googleapis.com/bigquery/v2/projects/sharedProjectId/jobs?alt=json returned "Value 'myProjectId' in content does not agree with value sharedProjectId'. This can happen when a value set through a parameter is inconsistent with a value set in the request.">
在 jobReference 和 sourceTable 中使用 sharedProjectId 我得到:
googleapiclient.errors.HttpError: https://www.googleapis.com/bigquery/v2/projects/sharedProjectId/jobs?alt=json returned "Access Denied: Job myJobId: The user myServiceAccountEmail does not have permission to run a job in project sharedProjectId">
对这两个作业使用 myProjectId 立即返回 'DONE' 状态并且没有错误,但没有导出任何内容。我的 GCS 桶是空的。
如果使用 API 确实无法做到这一点,是否还有另一个 method/tool 可用于自动从共享数据集中提取数据?
* 更新 *
在我的 GA 登录下使用 API 资源管理器 运行ning 效果很好。在我的代码中,我使用以下方法:
service.jobs().insert(projectId=myProjectId, body=job_data).execute()
并删除了包含 projectId
的 jobReference 对象job_data = {
'configuration': {
'extract': {
'sourceTable': {
'projectId': sharedProjectId,
'datasetId': sharedDatasetId,
'tableId': sharedTableId,
},
'destinationUris': [cloud_storage_path],
'destinationFormat': 'AVRO'
}
}
}
但是这个returns错误
Access Denied: Table sharedProjectId:sharedDatasetId.sharedTableId: The user 'serviceAccountEmail' does not have permission to export a table in dataset sharedProjectId:sharedDatasetId
我的服务帐户现在是共享数据集的所有者并且对 MyProject 具有编辑权限,在其他地方需要设置权限或者是否可以使用 python API 使用我的GA 登录凭据而不是服务帐户?
* 更新 *
终于成功了。如何?确保服务帐户具有查看数据集的权限(如果您无权自行检查,而有人告诉您可以,请他们给您双倍 check/send 截图!)
在尝试重现问题后,我 运行 遇到了解析错误。
我在开发者控制台 [2] 上玩过 API 并且它起作用了。
这是我 运行 让它工作的代码。
{
'configuration': {
'extract': {
'sourceTable': {
'projectId': "sharedProjectID",
'datasetId': "sharedDataSetID",
'tableId': "sharedTableID"
},
'destinationUri': "gs://myBucket/myFile.csv"
}
}
}
HTTP 请求
POST https://www.googleapis.com/bigquery/v2/projects/myProjectId/jobs
如果您仍然 运行 遇到问题,您可以尝试网站 [2] 上的 jobs.insert API 或尝试 bq 命令工具 [3] .
下面的命令可以做同样的事情:
bq 提取 sharedProjectId:sharedDataSetId.sharedTableId gs://myBucket/myFile.csv
希望这对您有所帮助。
[2] https://cloud.google.com/bigquery/docs/reference/v2/jobs/insert
确保服务帐户具有查看数据集的权限(如果您无权自行检查,而有人告诉您有权限,请让他们给您双倍 check/send 截图! )