是否有元数据表来检查 BigQuery 中的表是否已分区?

Posted

技术标签:

【中文标题】是否有元数据表来检查 BigQuery 中的表是否已分区?【英文标题】:Is there a metadata table to check if the table in BigQuery is partitioned? 【发布时间】:2017-07-03 08:38:35 【问题描述】:

我有以下要求。

我们在 BQ 中有 1400 个基于特定功能分组的分片表。 这些单独的分片表中的最大值也按 DAY 进行时间分区。

较小的表没有时间分区。

我正在尝试通过对所有分片表进行 UNION 并在 _partitiontime 上编写 WHERE 过滤条件来在 BigQuery 中动态创建视图。

但问题是可能存在未按时间分区的较小表,查询失败。

每天都会创建更多的表,我无法满足于静态排除解决方案,因为这需要手动维护带有表名等的文件。(Apache Beam + BQ 使用传入的数据并创建新的分片新功能组的表格,无需人工干预。)

我正在尝试通过使用bq 实用程序连接到 BQ 超过 1000 次来检查表是否是时间分区的,从而排除非时间分区表。

bq show --format=prettyjson 并检查 timepartitioning type 字段。

这个很慢,30多分钟。

我试过__TABLES_SUMMARY__,但它没有分区信息。

我也检查过 SELECT partition_id from [mydataset.table1$__PARTITIONS_SUMMARY__];,但如果表已分区,则此方法有效。

【问题讨论】:

您找到解决方法了吗?而是拥有单独的数据集? 【参考方案1】:

您可以在 BQ 中使用标准 SQL 编写以下查询以获取信息

SELECT * 
  FROM `project_id.dataset_name.INFORMATION_SCHEMA.COLUMNS`
  WHERE TABLE_NAME = Table_Name 
    AND is_partitioning_column = "YES"

【讨论】:

【参考方案2】:

很遗憾,无法动态确定这一点。

作为一种解决方法,我建议将分区表和非分区表保存在不同的数据集中,或者包括有关表是否以其名称分区的信息。

您还可以维护一个已知已分区(或未分区,如果这样更易于维护)的表前缀列表。

您还可以在 BigQuery 的公共问题跟踪器上打开功能请求:https://issuetracker.google.com/issues/new?component=187149&template=0

【讨论】:

只是好奇,这是在新版本中实现的吗?【参考方案3】:

你可以用try和except编写一个运行这样的查询的函数,如果表没有分区,查询会出错。

SELECT partition_id FROM [%s.%s$__PARTITIONS_SUMMARY__]' % (dataset_id, table_id)

【讨论】:

以上是关于是否有元数据表来检查 BigQuery 中的表是否已分区?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查列表中是不是有元组?

用于检查整个表的空值的 Bigquery SQL 函数

BigQuery 中的表视图是不是受益于分区/集群优化?

BigQuery 请求查找表之间的更改

检查MYSQL数据中的表是否都正常

是否可以使用 UDF 从 BigQuery 读取 gcs 对象的元数据