我有以下要求。
我们根据特定的功能分组在BQ中分割了1400个表。 这些单独的分片表的最大值也是DAY的时间分区。
较小的表没有时间分区。
我试图通过对所有分片表进行UNION并在_partition时间写一个WHERE过滤条件,在BigQuery中动态创建视图。
但问题是可能有较小的表没有时间分区,查询失败。
每天都会创建更多的表格,我不能满足于静态排除解决方案,因为这需要手动维护带有表名等的文件。(Apache Beam + BQ使用正在进入的数据并创建新的分片没有人工干预的新功能组的表格
我试图通过使用bq实用程序连接到BQ超过1000次来排除非时间分区表,以检查表是否是时间分区的。
bq show --format = prettyjson 并检查" timepartitioning" "类型"提起。
这非常慢,并没有我预期的那么快。 (超过30分钟)
我尝试了 TABLES_SUMMARY ,但它没有分区信息。
我也检查过了 从[mydataset.table1 $ PARTITIONS_SUMMARY ]中选择partition_id;
但如果表已经分区,则此方法有效。
的问候。
答案 0 :(得分:2)
您可以使用BQ中的标准SQL编写以下查询,以获取信息
SELECT *
FROM `project_id.dataset_name.INFORMATION_SCHEMA.COLUMNS`
WHERE TABLE_NAME = Table_Name
AND is_partitioning_column = "YES"
答案 1 :(得分:0)
不幸的是,没有办法动态地确定这一点。
作为一种解决方法,我建议将分区表和非分区表保存在不同的数据集中,或者包括有关表是否以其名称进行分区的信息。
您还可以维护已知为分区的表前缀列表(如果更易于维护,则保留未分区的表)。
您还可以在BigQuery的公共问题跟踪器上打开功能请求:https://issuetracker.google.com/issues/new?component=187149&template=0
答案 2 :(得分:0)
您可以编写一个函数,使用try来运行这样的查询,但如果表未分区,查询将出错。
SELECT partition_id FROM [%s.%s$__PARTITIONS_SUMMARY__]' % (dataset_id, table_id)