【问题标题】:Exporting data from BigQuery to GCS - Partial transfer possible?将数据从 BigQuery 导出到 GCS - 可以进行部分传输吗?
【发布时间】: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


【解决方案1】:

如果作业在执行过程中由于某种原因失败,则可以进行部分导出。

如果作业处于 DONE 状态,作业没有错误,则所有数据都已导出。

我建议在轮询作业完成之前稍等片刻——如果轮询太快,可能会遇到速率限制错误,并且鉴于这些异步作业并不快,因此不需要毫秒精度。

使用您的示例代码,您可以通过以下方式测试是否存在错误:

while True:
    status = query_request.get(projectId=constants.PROJECT_NUMBER, jobId=query_response['jobReference']['jobId']).execute() 
    if 'DONE' == status['status']['state']:
        if 'errorResult' in status['status']:
            logging.error("Error exporting for the date : " + stringCanonicalDate);
            logging.error(status['status']['errorResult'])
            return False
        logging.info("Finished exporting for the date : " + stringCanonicalDate);
        return True
    time.sleep(1)

为了超级健壮,您还可以捕获在轮询等待循环中偶尔发生的 HTTP 错误。看起来您正在使用 python apiclient,它会在此类失败时引发 apiclient.errors.HttpError

【讨论】:

  • 谢谢。这是有道理的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-04
  • 1970-01-01
  • 2021-12-24
  • 2018-11-18
  • 2020-01-18
  • 1970-01-01
相关资源
最近更新 更多