【问题标题】:Partition BigQuery materialized view on aggregated column对聚合列进行分区 BigQuery 物化视图
【发布时间】:2021-08-10 14:00:25
【问题描述】:

我有一个表 logs 包含这些列:

时间戳 sessionID elementID 值

logs 表在 timestamp 列上进行分区。

我用它创建了一个物化视图:

create materialized view X
partition by date(new_timestamp)
as
select min(timestamp) as new_timestamp, sessionID, elementID, sum(value) as sumvalue 
from logs 
group by sessionID, elementID

我收到错误消息“实体化视图的分区列必须与基表的分区列或伪列匹配,或者是它之上的 TIMESTAMP_TRUNC。”

BigQuery 文档说对物化视图进行分区的唯一方法是使用与主表完全相同的分区列,即使列上的 min() 运算符也不被接受。你知道尽管有这个限制,我怎样才能达到我想要的结果吗?

【问题讨论】:

  • 你试过partition by TIMESTAMP_TRUNC(new_timestamp, DAY)吗?如果您只想获取日期值(而不是小时、分钟、秒...),则相当于将其转换为 Date。
  • 您好,感谢您的评论。 Timestamp_trunc 现在也可以工作,因为 new_timestamp 不是母表的分区列。我应该用来对物化视图进行分区的分区列是时间戳,但我不能直接将它用于我的用例。我需要每个组的所有时间戳的最小值。
  • 您找到解决问题的方法了吗?与基表分区列相比,我想在 MV 中使用不同的(计算的)列。
  • 很遗憾我还没有找到解决方案

标签: google-cloud-platform google-bigquery partition materialized-views


【解决方案1】:

重新审视你的问题给了我一个简单的答案:直接使用timestamp

确实,您将仅在实体化视图中存储min(timestamp)。因此,数据的分区/分片将通过时间戳、最小值或最大值来完成,这不是目的!

【讨论】:

  • 我希望它能工作,但如果我不直接在 select 语句中公开时间戳字段,我就无法在时间戳上分区。我不能公开它,因为我也必须对其进行聚合,这会破坏表格的逻辑。
  • 同意.... 无论如何,您确定您的查询吗?如果按时间戳分组,如何获得最小时间戳?在这种情况下 min(timestamp) 总是 = 到时间戳,不是吗?
  • 感谢您的留言,我不小心添加了。分组应该只在 sessionID 和 elementID 上完成,我修改了原始消息中的查询 :) 不幸的是我仍然没有找到问题的解决方案...
  • 我尝试了您的问题并以不同的方式解决了它:子查询、连接、...所有这些功能目前都已从物化视图中停用。所以,我认为你现在无法做到这一点......也许在 6 个月左右......
  • 谢谢,希望比这更早:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
  • 2017-02-03
  • 2022-01-22
  • 2020-04-08
  • 2021-07-21
  • 2020-11-27
  • 1970-01-01
相关资源
最近更新 更多