是否有元数据表来检查 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 中的表是否已分区?的主要内容,如果未能解决你的问题,请参考以下文章