【问题标题】:Bigquery export splits into multiple files with some empty filesBigquery 导出拆分为多个文件,其中包含一些空文件
【发布时间】:2020-07-15 11:45:06
【问题描述】:

我正在尝试使用 bigquery 导出功能以 json 格式将数据推送到 GCS。 在该过程结束时,为了验证 GCS 文件中导出记录的计数,我正在创建一个具有自动模式检测功能的外部表,只是为了计算导出的 GCS 文件中的记录数。

这适用于单个导出的文件。但是对于大于 1gb 的表,我使用通配符来分割成多个文件。这会导致多个文件同时创建了一些空文件。

查询外部表时,空文件导致错误:“400 Schema has no fields”。

请向以下人员提出任何想法:

  1. 确保在多文件方案的导出操作中不会创建空文件
  2. 在创建外部表时忽略空文件。
  3. 导出操作后在 GCS 中计算记录的任何其他方式

【问题讨论】:

  • 奇怪的是BQ会创建空文件。就我而言,每次我尝试使用大于 5GB 的表时它都有效。创建的所有文件至少包含超过 35MB。你是怎么做出口的?您是否从 UI 尝试过?有没有可能您已经在该存储桶上创建了一些文件,而这些文件与新文件混淆了?
  • 我正在使用 python 库进行导出。我也尝试过使用 UI 导出,行为是相同的。创建多个空文件以及拆分文件(小于 1 gb)
  • 看起来 bq 导出的现有行为也会生成一些空文件。我找到了解决我的问题的方法,方法是为外部表设置架构而不是使用自动架构检测,然后即使存在空文件,它也可以工作。
  • @jay12345 您能否分享您的想法和潜在的解决方法,以解决问题的目的,提供有价值的答案,为 Stack 社区做出最大努力?

标签: json google-bigquery export external-tables


【解决方案1】:

我遇到了同样的问题,但我找到了一种解决方法:TEMP TABLE 似乎可以解决问题。

(编辑:阅读doc 我注意到“导出数据”一直被描述为 BigQuery 表,而不是自定义选择。而且由于我在导出真实表时从未遇到过空文件,所以我给了临时表同样的机会)

假设我们有以下查询:

EXPORT DATA OPTIONS(
    uri='gs://mybucket/extract-here/*.csv.gz'
    , format='CSV'
    , compression='GZIP'
    , overwrite=true
    , header=true
    , field_delimiter=","
) AS (
    WITH mytable AS (
        SELECT col FROM UNNEST([1,2,3,4,5,6,7,8]) AS col
    )
    SELECT * FROM mytable
);

你可以改写如下:

BEGIN
    CREATE TEMP TABLE _SESSION.tmpExportTable AS (
        WITH mytable AS (
            SELECT col FROM UNNEST([1,2,3,4,5,6,7,8]) AS col
        )
        SELECT * FROM mytable
    );
    EXPORT DATA OPTIONS(
        uri='gs://mybucket/extract-here/*.csv.gz'
        , format='CSV'
        , compression='GZIP'
        , overwrite=true
        , header=true
        , field_delimiter=","
    ) AS
    SELECT * FROM _SESSION.tmpExportTable;
END;

【讨论】:

  • 绝妙的解决方案!
猜你喜欢
  • 1970-01-01
  • 2019-09-18
  • 1970-01-01
  • 1970-01-01
  • 2018-11-18
  • 2017-05-20
  • 2020-07-05
  • 1970-01-01
  • 2015-05-29
相关资源
最近更新 更多