繁体   English   中英

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

[英]Extracting BigQuery Data From a Shared Dataset

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

我可以使用网络浏览器手动完成此操作,但无法使用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不一致。当通过参数设置的值与请求中设置的值不一致。“>

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

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

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

如果使用API​​确实无法做到这一点,是否还有另一种方法/工具可用于自动从共享数据集中提取数据?

*更新*

使用在我的Google Analytics(分析)登录名下运行的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'无权导出数据集sharedProjectId:sharedDatasetId中的表

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

*更新*

终于让它工作了。 怎么样? 确保服务帐户具有查看数据集的权限(如果您无权自己检查此数据集,并且有人告诉您可以这样做,请要求他们仔细检查/向您发送屏幕截图!)

尝试重现该问题后,我遇到了解析错误。 我做了过开发者控制台[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提取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

确保服务帐户具有查看数据集的权限(如果您无权自己检查此数据集,并且有人告诉您可以这样做,请要求他们仔细检查/向您发送屏幕截图!)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM