为啥 Google BigQuery 在使用视图时没有正确使用分区日期

Posted

技术标签:

【中文标题】为啥 Google BigQuery 在使用视图时没有正确使用分区日期【英文标题】:Why Google BigQuery doesn't use partition date correctly when using views为什么 Google BigQuery 在使用视图时没有正确使用分区日期 【发布时间】:2016-12-19 17:56:24 【问题描述】:

我有一个日期分区表(称为sample_table),它有 2 列,一列用于以 UTC 格式保存 dateTime,另一列用于保存时区偏移量。我在这张桌子的顶部有一个视图(称之为sample_view)。该视图从表中获取_partitiontime 并将其公开为partitionDate 列,还有另一列customerDateTime 只是将dateTime 与timeZoneOffset 添加。

当我仅使用 _partitiontime 直接查询 sample_table 时,bigquery 扫描的数据要少得多 (131 MB)。

select
  containerName,
  count(*)
from
  [sample_project.sample_table] 
where
  _partitiontime between timestamp('2016-12-12') and timestamp('2016-12-19')
  and customer = 'X'
  and containerName = 'XXX'
group by containerName
;

但是当我根据客户的本地日期时间对带有dateTime 列的表运行相同的查询以进行扫描时,大查询会扫描更多(211MB)。我预计小于 131MB 或等于 131MB。

select
  containerName,
  count(*)
from
  [sample_project.sample_table] 
where
  _partitiontime between timestamp('2016-12-12') and timestamp('2016-12-19')
  and DATE_ADD(dateTime, 3600, 'SECOND' ) between timestamp('2016-12-12 08:00:00') and timestamp('2016-12-19 15:00:00')
  and customer = 'X'
  and containerName = 'XXX'
group by containerName
;

当我使用 partitionDatesample_view 运行类似查询时,bigquery 扫描更多 (399MB)

select
  containerName,
  count(*)
from
  [sample_project.sample_view] 
where
  partitionDate between timestamp('2016-12-12') and timestamp('2016-12-19')
  and customer = 'X'
  and containerName = 'XXX'
group by containerName
;

当我使用 partitionDate 对视图运行查询并使用 customerDateTime 列以及 bigquery 扫描更多 (879MB)

select
  containerName,
  count(*)
from
  [sample_project.sample_view] 
where
  partitionDate between timestamp('2016-12-12') and timestamp('2016-12-19') and customerDateTime between timestamp('2016-12-12 08:00:00') and timestamp('2016-12-19 15:00:00')
  and customer = 'X'
  and containerName = 'XXX'
group by containerName
;

我不太确定我是否正在从上述任何查询中扫描正确的分区。为什么我会看到这些查询之间的差异?将 _partitiontime 公开为新列 partitionDate 是一个糟糕的策略吗?我不确定如何在不编写更多查询的情况下在 Tableau 中使用分区日期。如果您需要更多详细信息,请告诉我。

【问题讨论】:

你的表有重复字段吗? @MikhailBerlyant 是的。 【参考方案1】:

您可能需要使用standard SQL 代替查询,因为旧版 SQL 在过滤器下推方面存在一些限制。我自己对 Tableau 不是很熟悉,但他们有一个 help page for BigQuery 讨论在旧版 SQL 和标准 SQL 之间切换。

【讨论】:

这很有趣,在更改视图以支持标准 SQL 后,扫描的字节数已下降到 314MB,但运行时间确实需要更长的时间(不知道为什么)。为什么在传统 SQL 中按日期分区的工作方式与标准 SQL 不同。我尝试浏览他们的文档,但无法获得足够的详细信息。 这是否意味着为了使用带有分区日期的视图,我必须使用旧版 SQL? 标准 SQL 支持分区表。你在哪里看到的?【参考方案2】:

只是猜测 - 您看到的问题是因为您有重复的字段。旧版 SQL 和标准 SQL 对展平结果的处理方式不同。旧版 SQL 确实使结果变平,因此您看到的不是原始记录的数量,而是它们中重复值的数量。而标准 SQL 保留原始结构。在 Legacy SQL 中,您需要特别注意消除 Flattening 的影响,而在 Standard SQL 中,它已经被处理了

【讨论】:

谢谢 - 我必须使用标准 SQL 才能在查询中有效地使用分区日期吗? 正如我试图在我的回答中指出的那样 - 您看到的问题很可能不是因为分区表! Legacy 和 Standard SQL 都支持分区表。标准 SQL 将对您有所帮助,因为它可以更有效地处理 ARRAYS(重复字段)。 好的 - 谢谢,但是当我对视图使用旧版 SQL 时,我仍然无法获得针对我的查询的查询以扫描更少的数据。事实上,在使用视图时,它看起来根本没有使用分区日期。 同意。这部分可能与视图中使用的分区有关。回答你的问题的问题是它太宽泛了。我建议将不同的问题分成不同的问题并分别发布。这样你就有更多/更好的机会解决它们。到目前为止 - 对于当前的问题 - 这就是我能帮你的全部

以上是关于为啥 Google BigQuery 在使用视图时没有正确使用分区日期的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery - 为啥在 Google Analytics 中提取交易数据不需要 UNNEST 运算符?

为啥 Google Analytics 和 BigQuery 之间的独特事件差异如此之大?

为啥通过 Google Apps 脚本向 Bigquery 加载的数据仅限于 513 行数据?

保存视图无法在 Google BigQuery 中创建有效的输出架构

了解 Google Bigquery 物化视图定价

如何在 Google bigquery 中为多个动态表创建授权视图?