Google BigQuery聚簇表在聚簇字段上使用WHERE子句运行查询时不会减小查询大小

时间:2018-10-05 16:20:23

标签: google-bigquery

我有一个500,000行的Google BigQuery表,已将其设置为由一个名为Date的TIMESTAMP字段进行分区,并由一个名为EventCategory的STRING字段进行聚类(这只是一个超过5亿行的表的示例)。

我有一个未分区且未群集的表副本。

我在两个表上都运行以下查询:

SELECT 
  * 
FROM 
  `table_name`   
WHERE
   EventCategory = "email"

只有2400行的EventCategory是“电子邮件”。当我在非群集表上运行查询时,我得到以下信息:

enter image description here

在集群表上运行查询时,我得到以下信息:

enter image description here

这是非群集表和群集表的架构:

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"

我得到以下结果:

enter image description here

EventCategory中有53640行是“ ad”,看起来集群确实减少了对表数据的扫描,尽管减少了很多(529.2MB比586MB)。

看起来集群正在工作,但表中的数据没有正确集群吗?我该如何解决?我尝试使用DDL多次重新创建表,甚至将表数据保存到GCS中的JSON中,然后将其导入到新的分区和集群表中,但是它没有任何改变。

日期分区是否位于群集的顶部?意思是BigQuery首先按日期分组,然后按这些日期组内的群集分组?如果是这样,我认为这可能可以解释这一点,但它会使聚类不是很有用。

3 个答案:

答案 0 :(得分:2)

如果每天的数据量少于100MB,那么群集将无法为您做很多事情-您每天可能会得到一个<= 100MB的数据簇。

您没有提到有多少天的数据(如Mikhail要求的分区数),但是由于扫描的总数据为500MB,我猜您至少有5天的数据,而更少每天超过100MB。

因此,您获得的结果似乎是预期的结果。

答案 1 :(得分:0)

聚类没有太大帮助的原因特定于表数据。该表是按事件划分的基于事件的数据,然后按EventCategory进行聚类(数据按每天的分区聚类)。由于每天每种EventCategory类型都会有大量行,因此在整个表中查询特定的EventCategory仍然必须搜索每个分区,然后几乎肯定会有一些带有该EventCategory的数据,这意味着几乎每个集群都必须也被搜索到。

答案 2 :(得分:0)

  • 数据按日期进行分区,并且在群集内进行
  • 当您一次加载整个分区(天)或将该分区(天)导出到Google Storage(应该免费)并将其再次导出到另一张表(当我们尝试加载4GB JSONS时)时,群集效果最佳差异约为60/10。