使用 Data Studio 修剪 BigQuery 分区

Posted

技术标签:

【中文标题】使用 Data Studio 修剪 BigQuery 分区【英文标题】:Pruning BigQuery partitions with Data studio 【发布时间】:2021-05-26 00:17:36 【问题描述】:

我有一个与这个问题几乎相同的场景:

How to choose the latest partition in BigQuery table?

还有一个额外的并发症。我需要将结果显示在 Data Studio 中。

设置

我有一系列数据集,它们以不同的时间间隔出现,我需要获取最新的分区。因为它们之间的时间段不一致,所以我不能只得到最后一天并使用它。

我可以使用 BigQuery 脚本通过动态查询成功地修剪查询,但是当我将此查询移动到数据洞察时,查询无法正确加载。

表格加载到数据源部分:

但是当我实际尝试在报告中使用它时:

Data Studio cannot connect to your data set.

Failed to fetch data from the underlying data set

Error ID: e6546a97

有没有办法通过修剪让 Data Studio 正确显示?

查询示例

DECLARE max_date DATE;
SET max_date = (SELECT DATE(MAX(_partitiontime)) FROM `dataset.table`);   

SELECT *
FROM `dataset.table`
WHERE DATE(_partitiontime ) = max_date

【问题讨论】:

DECLARE 语句在 DataStudio 中不起作用,因为整个自定义查询都包含在外部选择中,因此此语法无效SELECT ........ FROM (DECLARE max_date .......................................) 啊,有道理。我很惊讶它甚至设法弄清楚里面有桌子。 【参考方案1】:

解决方法:

一种可能性是使用日期参数并进行如下查询:

SELECT *
FROM `dataset.table`
WHERE DATE(_PARTITION_TIME)>= PARSE_DATE("%Y%m%d", @DS_START_DATE)

这并不完全是答案,但是使用默认为“昨天到今天”数据的日期范围,您可以有效地将表修剪为仅最近的分区。如果您提到的数据不规则,用户仍然可以手动扩展日期范围,直到找到数据。

同时,您还可以将以下自定义查询添加到您的数据源:

SELECT 
    MAX(SAFE.PARSE_DATE('%Y%m%d',partition_id)) AS latest_available_partition
FROM `dataset.INFORMATION_SCHEMA.PARTITIONS`
WHERE TABLE_NAME = "table"

并将其显示在表格中以向用户提供信息。

确实,这种解决方法意味着您相信最终用户不会过多地使用日期范围。

【讨论】:

【参考方案2】:

您可以访问project.dataset.INFORMATION_SCHEMA.PARTITIONS 表中的所有分区信息。 因此,您可以尝试以下方法:

SELECT *
FROM `dataset.table`
WHERE DATE(_PARTITION_TIME) = (
    SELECT 
        MAX(SAFE.PARSE_DATE('%Y%m%d',partition_id))
    FROM `dataset.INFORMATION_SCHEMA.PARTITIONS`
    WHERE TABLE_NAME = "table"
)

确保您了解修剪适用于上述查询:

【讨论】:

查询有效,但不幸的是它仍然扫描所有分区,这在我必须使用的一些大表上并不是一个很好的解决方案。 @DominicWoodman 你确定吗?我正在使用这个技巧并且效果很好。 确实很奇怪:这个查询在我的项目中的分区表上按预期工作(查询 10Mb,主要是 INFORMATION_SCHEMA,而不是整个表的数百 Mb),但是当我尝试相同的从 BQ 公共数据集中查询分区表整个表被解析... @Cylldby 剪枝效果很好,请参阅有关大型公共数据集的图片。不要采用 BigQuery 用户界面上预测的数字,该数字使用的是预演功能并且不反映修剪。运行查询并查看它正在修剪分区。

以上是关于使用 Data Studio 修剪 BigQuery 分区的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:修剪包含的模板

prune.tree 中的错误无法修剪 R.tree 中的单节点树

去除修剪特殊字符

如何在R中修剪一棵树?

用东西 sql 修剪标量 UDF

如何修剪向量字符数组或字符串?