Clickhouse中具有唯一和非唯一数据的频率直方图
Posted
技术标签:
【中文标题】Clickhouse中具有唯一和非唯一数据的频率直方图【英文标题】:Frequency Histogram in Clickhouse with unique and non unique data 【发布时间】:2019-05-17 13:12:57 【问题描述】:我有一个包含 created_at(DateTime)、userid(String)、eventid(String) 列的事件表。这里 userid 可以是重复的,而 eventid 总是唯一的 uuid。
我正在寻找构建唯一和非唯一频率直方图。
这适用于基于给定三个输入的 eventid 和 userid
-
开始日期时间
end_datetime 和
间隔(1 分钟、1 小时、1 天、7 天、1 个月)。
这里,bucket 将由 (end_datetime - start_datetime)/interval 决定。
输出为 start_datetime、end_datetime 和频率。 对于任何时间间隔,如果数据不可用,则 start_datetime 和 end_datetime 出现,但频率为 0。
如何为此构建通用查询?
我查看了直方图函数,但找不到任何文档。在尝试时,我无法理解输入和输出背后的关系。
【问题讨论】:
看一些使用histogram的例子:github.com/yandex/ClickHouse/blob/master/dbms/tests/queries/… @vladimir 感谢您的链接。我试过了,但不确定我们如何强制这里的间隔跨越 1 分钟、1 小时、1 天、7 天等 【参考方案1】:count(distinct XXX)
已弃用。
更有用的uniq(XXX)
或uniqExact(XXX)
【讨论】:
好的。但看起来 CH 正在将 count(distinct XXX) 转换为 uniqExact(XXX)。虽然性能仍然很低【参考方案2】:我使用以下方法让它工作。这里的toStartOfMonth可以改成CH中其他类似的函数。
select toStartOfMonth(`timestamp`) interval_data , count(distinct uid) count_data
from g94157d29.event1
where `timestamp` >= toDateTime('2018-11-01 00:00:00') and `timestamp` <= toDateTime('2018-12-31 00:00:00')
GROUP BY interval_data;
和
select toStartOfMonth(`timestamp`) interval_data , count(*) count_data
from g94157d29.event1
where `timestamp` >= toDateTime('2018-11-01 00:00:00') and `timestamp` <= toDateTime('2018-12-31 00:00:00')
GROUP BY interval_data;
但在 toYYYYMM(timestamp) 为分区且 toYYYYMMDD(timestamp) 为排序依据的事件表中,每月超过 20 亿条记录的性能非常低。
不同计数查询需要 > 30GB 的空间和 30 秒的时间。还没有完成。
而一般计数查询需要 10-20 秒才能完成。
【讨论】:
以上是关于Clickhouse中具有唯一和非唯一数据的频率直方图的主要内容,如果未能解决你的问题,请参考以下文章