BigQuery 上的提取作业不能确保 Google 存储上的文件

Posted

技术标签:

【中文标题】BigQuery 上的提取作业不能确保 Google 存储上的文件【英文标题】:Extact Job on BigQuery doesn't ensure files on Google Storage 【发布时间】:2021-06-16 15:00:29 【问题描述】:

我正在执行对谷歌存储的提取查询,如下所示:

job_config = bigquery.ExtractJobConfig()
job_config.compression = bigquery.Compression.GZIP
job_config.destination_format = (bigquery.DestinationFormat.CSV)
job_config.print_header = False
job_config.field_delimiter = "|"

extract_job = client.extract_table(
            table_ref,
            destination_uri,
            job_config=job_config,
            location='us-east1', 
            retry=query_retry,
            timeout=10)  # API request
        extract_job.result()

它返回一个 ExtractJob 类,并且根据 google 文档 (https://googleapis.dev/python/bigquery/1.24.0/generated/google.cloud.bigquery.job.ExtractJob.html#google.cloud.bigquery.job.ExtractJob), 我需要调用 extract_job.result() 来等待作业完成。完成后,我注意到谷歌云存储上的文件(还没有),可能有延迟。我需要确保文件在提取作业后准备好使用,有一个 API 方法可以解决这个问题,或者我必须采取一种解决方法来休眠并等待文件?

【问题讨论】:

AFAIK,没有 API。在继续之前,您需要轮询文件以确保它们存在。如果可以的话,您还可以在设计中对 Cloud Storage 事件做出反应并对该事件执行处理。 【参考方案1】:

您传递的destination_uri 是什么?这应该是一个字符串列表,但是因为您在参数中使用了单数 uri,所以听起来您可能传递了一个会被误解的单个字符串("gs://abc/def" 将被视为["g","s","/","/","a"...]

这应该会导致错误,您是否遇到异常?

【讨论】:

我正在传递此参数,因为该作业正在提取一个文件,但它使用通配符 -*。在 GCP 中,如果您的文件大于 1GB,他会拆分为文件-00000001、文件-00000002 等分片...【参考方案2】:

非常感谢您抽出宝贵时间。我发现 python API 在 Job 类中有 destination_uris 属性。这给了我一个提取文件的 URI 列表,列表的计数告诉我提取了多少文件。

【讨论】:

以上是关于BigQuery 上的提取作业不能确保 Google 存储上的文件的主要内容,如果未能解决你的问题,请参考以下文章

提取操作中的 BigQuery 错误:错误处理作业意外。请再试一次

将 gcloud 虚拟机实例监控数据提取到 BigQuery

Bigquery 数据未上传

Google play 到 BigQuery 转移作业中的错误

尽管更新了架构,但 BigQuery 架构错误

如何查询在 bigquery 操作中提交的特定作业 ID