从共享数据集中提取BigQuery数据

时间:2015-04-14 09:22:05

标签: python google-api google-bigquery google-cloud-storage google-client

是否可以使用客户端API(python)从共享数据集(我只有查看权限)中提取数据(到谷歌云存储)?

我可以使用网络浏览器手动执行此操作,但无法使用API​​工作。

我已经为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   返回"价值' myProjectId'在内容上不同意价值   sharedProjectId&#39 ;.通过参数设置值时可能会发生这种情况   与请求中设置的值不一致。">

在jobReference和sourceTable中使用sharedProjectId我得到:

  

googleapiclient.errors.HttpError:https://www.googleapis.com/bigquery/v2/projects/sharedProjectId/jobs ?alt = json   返回"访问被拒绝:作业myJobId:用户myServiceAccountEmail   没有权限在项目sharedProjectId">

中运行作业

使用myProjectId立即返回作业状态为“DONE”'并且没有错误,但没有导出任何内容。我的GCS存储桶是空的。

如果确实无法使用API​​,是否有其他方法/工具可用于自动从共享数据集中提取数据?

*更新*

使用在我的GA登录下运行的API资源管理器可以正常工作。在我的代码中,我使用以下方法:

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'
            }
        }
    }

但这会返回错误

  

拒绝访问:表sharedProjectId:sharedDatasetId.sharedTableId:用户' serviceAccountEmail'没有导出表的权限   dataset sharedProjectId:sharedDatasetId

我的服务帐户现在是共享数据集的所有者,并且对MyProject具有编辑权限,还需要设置权限还是可以使用我的GA登录凭据而不是服务帐户来使用python API?< / p>

*更新*

终于开始工作了。怎么样?确保服务帐户有权查看数据集(如果您无权自行检查并且有人告诉您确实如此,请让他们仔细检查/发送截图!)

2 个答案:

答案 0 :(得分:4)

尝试重现问题后,我遇到了解析错误。 我在开发者控制台[2]上如何使用API​​,并且它有效。 jobs.insert 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 extract 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

答案 1 :(得分:0)

确保服务帐户有权查看数据集(如果您无权自行查看,有人告诉您确实如此,请让他们仔细检查/发送截图!)