如何从已分区的 BigQuery 表中提取单个分区?

Posted

技术标签:

【中文标题】如何从已分区的 BigQuery 表中提取单个分区?【英文标题】:How can I extract a single partition from a partitioned BigQuery table? 【发布时间】:2020-06-16 13:31:04 【问题描述】:

根据BigQuery docs,我应该可以导出分区表的单个分区:

从分区表中导出所有数据与从非分区表中导出数据的过程相同。有关详细信息,请参阅导出表数据。要从单个分区导出数据,请将分区修饰符 $date 附加到表名。例如:mytable$20160201。

但是,运行以下提取命令会提取整个表,而不仅仅是一个分区。它快把我逼疯了!我做错了什么?

bq --location=europe-west2 extract \
--destination_format NEWLINE_DELIMITED_JSON \
--compression GZIP \
bq-project-name:dataset.table_name$20200405 \
"gs://bucket-name/test_ga_sessions*.json.gz"

在此处添加源表的分区信息

我还确认我尝试提取的分区存在

#legacySQL
SELECT
  partition_id,
  creation_time,
  creation_timestamp,
  last_modified_time,
  last_modified_timestamp
FROM
  [dataset.tablename$__PARTITIONS_SUMMARY__]
  where partition_id = '20200405'

【问题讨论】:

你试过引用表名吗? $ 运算符可能会在终端中弄乱表名 谢谢@Tlaquetzal。我也试过了,还是不行 在我的脑海中,可能会影响分区感知的另一件事是:表可能按摄取时间而不是日期列进行分区。我注意到在您使用的存储桶名称中,最终文件的名称为“ga_sessions”。如果您使用来自 GA 导出的信息,那么您要导出的表甚至可能不会被分区。您能否使用要导出的表的分区详细信息更新问题? @Tlaquetzal 我正在导出的表包含转换后的 GA 数据,因此得名。它不是原始的 GA 表。我已更新我的问题,以包含我要导出的表的分区信息。 感谢您的更新。一切看起来都很好,所以这可能是服务的问题。我要检查的最后一件事是,1) 当您尝试导出不存在的分区时的行为是什么,例如 20100101 日。这是否也会导出所有表?和 2) 考虑在目标 URI 中使用通配符时,文件名中的计数将从 00000 开始,而不是导出日期。如果这些信息不能提供新的见解,请告诉我 【参考方案1】:

因为我在 bash shell 中运行 bq extract 命令,所以分区装饰器 $20200405 被解释为一个变量并且是一个空变量。因此,当请求到达 BigQuery 时,bq-project-name:dataset.table_name$20200405 的完整分区标识符被解释为 bq-project-name:dataset.table_name

为了让这个命令正确运行,我所要做的就是使用反斜杠转义分区装饰器的$ 字符,如下所示:

bq --location=europe-west2 extract \
--destination_format NEWLINE_DELIMITED_JSON \
--compression GZIP \
bq-project-name:dataset.table_name\$20200405 \
"gs://bucket-name/test_ga_sessions*.json.gz"

【讨论】:

我想将所有分区表数据(我不知道分区表的创建日期)导出到数据存储中。有更好的方法吗? 你能再解释一下你的问题吗? 我想将所有分区表数据导出到数据存储中,我的意思是在上面的代码中您提到了仅将表导出为一个日期,即 bq-project-name:dataset .table_name\$20200405 。就我而言,我必须备份我们拥有的所有分区数据(几乎 90GB)。我必须每天备份所有分区表(所有数据)。于是就想知道怎么做?还有一旦我们进行了备份,如何从数据存储中恢复所有数据(好像所有原始数据都被删除了,我们必须从数据存储中恢复所有数据)? 要备份整个表,您可以简单地省略分区装饰器,以便为bq-project-name:dataset.table_name。或者,您可以查询表元数据以查找表上存在哪些分区并单独备份每个分区。至于从数据存储中恢复,我建议参考BQ文档。

以上是关于如何从已分区的 BigQuery 表中提取单个分区?的主要内容,如果未能解决你的问题,请参考以下文章

Bigquery 分片与 Bigquery 分区

使用 Big Query API 将数据提取到按时间分区的表中,但出现 SyntaxError: Unexpected end of input

在时间分区的 bigquery 表中,数据何时写入_UNPARTITIONED_?有啥影响?

BigQuery:使用 DML 原子地替换日期分区

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

如何在 BigQuery UI 中插入覆盖分区表?