Bigquery 导出拆分为多个文件,其中包含一些空文件

Posted

技术标签:

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

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

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

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

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

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

【问题讨论】:

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

【讨论】:

绝妙的解决方案!

以上是关于Bigquery 导出拆分为多个文件,其中包含一些空文件的主要内容,如果未能解决你的问题,请参考以下文章

查询结果后 BigQuery 导出多个文件

是否可以在 BigQuery 中取消嵌套数组,以便将嵌套数据按键值拆分为列?

BigQuery SQL 中跨多个字段的拆分函数

需要关于基于非日期列和日期分区在 bigquery 中拆分表的建议

使用 bigquery 和单个查询进行分区,根据日期将表拆分为多个表

如何将一张包含多个表格的 Excel 文件拆分为单独的数据框?