【发布时间】:2015-04-30 15:29:44
【问题描述】:
我目前正在将我的数据(从 Bigquery 中的目标表)导出到 GCS 中的存储桶。使用 Bigquery API 以编程方式执行此操作。
将数据从 Bigquery 导出到 GCS 时存在限制 - 数据不应大于 1GB。
- 由于我的目标表中的数据超过 1GB,因此我将文件拆分为多个部分。
- 文件将被拆分的部分数量显然取决于目标表中的数据大小。
这是发生这种情况的函数 exportDataToGCS() 的代码 sn-p:
http = authorize();
bigquery_service = build('bigquery', 'v2', http=http)
query_request = bigquery_service.jobs()
DESTINATION_PATH = constants.GCS_BUCKET_PATH + canonicalDate + '/'
query_data = {
'projectId': 'ga-cnqr',
'configuration': {
'extract': {
'sourceTable': {
'projectId': constants.PROJECT_ID,
'datasetId': constants.DEST_TABLES_DATASET_ID,
'tableId': canonicalDate,
},
'destinationUris': [DESTINATION_PATH + canonicalDate + '-*.gz'],
'destinationFormat': 'CSV',
'printHeader': 'false',
'compression': 'GZIP'
}
}
}
query_response = query_request.insert(projectId=constants.PROJECT_NUMBER,
body=query_data).execute()
执行此函数后,在我的 GCS 存储桶中,我的文件以下列方式显示:
但是,我很想知道是否存在文件应该被分成 10 部分的任何情况,但由于上述功能失败,只有 3 部分进入存储桶。
也就是说,是否可以进行部分导出?
网络掉线或运行函数的进程被杀死等原因会导致这种情况吗?这个过程是阻塞调用吗?异步?
提前致谢。
更新 1:查询响应中的状态参数
这就是我检查 DONE 状态的方式。
while True:
status = query_request.get(projectId=constants.PROJECT_NUMBER, jobId=query_response['jobReference']['jobId']).execute()
if 'DONE' == status['status']['state']:
logging.info("Finished exporting for the date : " + stringCanonicalDate);
return
【问题讨论】:
-
当您说“上述功能失败”时,您是否有错误消息?或者您唯一的失败迹象是您缺少 3 个部分?
-
您返回的查询响应有一个名为“状态”的参数。当 this 等于 "DONE" 时,表示查询完成。
-
检查我的问题中的更新。第一个代码 sn-p 和第二个代码 sn-p 都在 try 块内。
-
很公平:)。 Status = 'DONE' 并不意味着错误字段为空。如果有什么东西,你可能想看看那里:)。可能是主要工作完成了,但是一个文件返回了错误
-
我想我不知道你在暗示哪个错误字段?你能解释一下吗?谢谢!
标签: asynchronous export google-bigquery google-cloud-storage callblocking