这是我当前在ClickHouse中使用的模型(简化):
leak
字段是对泄漏ID的引用。
我正在将MergeTree引擎用于Credential
,将Log用于Leak
。
有时会插入两个相同的凭据,因此我有例如:
|用户|域|密码0 |
|用户|域|密码1 |
我想把它变成:
|用户|域|密码[0,1] |
我已经阅读了有关ReplacecingMergeTree的信息,但是除了version
参数之外,我没有找到其他方法来指定一些重写/删除规则。
我的问题是我有数十亿个条目,在插入之前处理数据听起来很疯狂。即使ClickHouse的响应时间非常短,但要检查我要插入的每个新凭据是否已经存在,以及是否更新其数据,对吗?
我正在尝试尽可能减少磁盘存储,但是在保持这些令人难以置信的响应时间的同时似乎很难平衡。我在听你的想法。
答案 0 :(得分:0)
有很多方法可以解决这个问题。
Materialized Table
。ReplacingMergeTree
。groupArray
查询表以获取所需的结果。在这里,我演示第四个解决方案。您只需像往常一样将数据插入MergeTree
中即可。但是查询时,您可以使用groupArray
将所需的列滚动为基于其他列的数组。
假设您的桌子是这样的:
SELECT *
FROM mem
┌─a─────┬─b───────┬─c─────────┬─d─┐
│ user1 │ domain1 │ password1 │ 0 │
│ user1 │ domain1 │ password1 │ 1 │
│ user2 │ domain2 │ password2 │ 0 │
│ user2 │ domain2 │ password2 │ 2 │
└───────┴─────────┴───────────┴───┘
您使用groupArray
解决了问题:
SELECT a, b, c, groupArray(d)
FROM mem
GROUP BY a, b, c
┌─a─────┬─b───────┬─c─────────┬─groupArray(d)─┐
│ user2 │ domain2 │ password2 │ [0,2] │
│ user1 │ domain1 │ password1 │ [0,1] │
└───────┴─────────┴───────────┴───────────────┘