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中具有唯一和非唯一数据的频率直方图的主要内容,如果未能解决你的问题,请参考以下文章

唯一与非唯一索引

MongoDB中唯一索引的优势

Django Rest:AssertionError:无法将唯一查询与非唯一查询组合

合并具有非唯一索引的多个数据帧

MySQL 5.0 索引 - 唯一与非唯一

在具有非唯一索引列日期的 Dask 数据框中提取最新值