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