从共享数据集中提取 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

[3] https://cloud.google.com/bigquery/bq-command-line-tool

确保服务帐户具有查看数据集的权限(如果您无权自行检查,而有人告诉您有权限,请让他们给您双倍 check/send 截图! )