我有一个500,000行的Google BigQuery表,已将其设置为由一个名为Date的TIMESTAMP字段进行分区,并由一个名为EventCategory的STRING字段进行聚类(这只是一个超过5亿行的表的示例)。
我有一个未分区且未群集的表副本。
我在两个表上都运行以下查询:
SELECT
*
FROM
`table_name`
WHERE
EventCategory = "email"
只有2400行的EventCategory是“电子邮件”。当我在非群集表上运行查询时,我得到以下信息:
在集群表上运行查询时,我得到以下信息:
这是非群集表和群集表的架构:
Date TIMESTAMP NULLABLE
UserId STRING NULLABLE
EventCategory STRING NULLABLE
EventAction STRING NULLABLE
EventLabel STRING NULLABLE
EventValue STRING NULLABLE
两个查询之间以及它们浏览多少数据之间基本上没有区别,我似乎无法弄清楚为什么?我已经确认集群表已经分区和集群了,因为在BigQuery UI中的表详细信息实际上是这样说的,并且通过按日期过滤来运行查询可以大大减少搜索到的数据的大小,并显示估计的查询大小要小得多。
这里的任何帮助将不胜感激!
更新:
如果我将查询更改为:
SELECT
*
FROM
`table_name`
WHERE
EventCategory = "ad"
我得到以下结果:
EventCategory中有53640行是“ ad”,看起来集群确实减少了对表数据的扫描,尽管减少了很多(529.2MB比586MB)。
看起来集群正在工作,但表中的数据没有正确集群吗?我该如何解决?我尝试使用DDL多次重新创建表,甚至将表数据保存到GCS中的JSON中,然后将其导入到新的分区和集群表中,但是它没有任何改变。
日期分区是否位于群集的顶部?意思是BigQuery首先按日期分组,然后按这些日期组内的群集分组?如果是这样,我认为这可能可以解释这一点,但它会使聚类不是很有用。
答案 0 :(得分:2)
如果每天的数据量少于100MB,那么群集将无法为您做很多事情-您每天可能会得到一个<= 100MB的数据簇。
您没有提到有多少天的数据(如Mikhail要求的分区数),但是由于扫描的总数据为500MB,我猜您至少有5天的数据,而更少每天超过100MB。
因此,您获得的结果似乎是预期的结果。
答案 1 :(得分:0)
聚类没有太大帮助的原因特定于表数据。该表是按事件划分的基于事件的数据,然后按EventCategory进行聚类(数据按每天的分区聚类)。由于每天每种EventCategory类型都会有大量行,因此在整个表中查询特定的EventCategory仍然必须搜索每个分区,然后几乎肯定会有一些带有该EventCategory的数据,这意味着几乎每个集群都必须也被搜索到。
答案 2 :(得分:0)