点击房屋-合并到一个新的类似条目

enxuqcxy  于 2021-07-15  发布在  ClickHouse
关注(0)|答案(1)|浏览(451)

这是我在clickhouse中的当前(简化)模型:

凭证表

用户:字符串
域:字符串
密码:string
泄漏:uint64
田野 leak 是对泄漏id的引用。

泄漏表

编号:uint64
名称:字符串
描述:字符串
日期:字符串
我在用mergetree引擎 Credential 和日志 Leak .
有时会插入两个same凭据,因此我有一个示例:
|用户|域|密码| 0|
|用户|域|密码| 1|
我想把它变成:
|用户|域|密码|[0,1]|
我读过关于replacingmergetree的文章,但是我没有找到比 version 参数。
我的问题是我有几十亿个条目,在插入之前处理数据听起来很疯狂。即使clickhouse的响应时间非常低,检查我尝试插入的每个新凭据是否都已在其中,如果已在其中,则更新其数据,这似乎很可笑,对吗?
我试图尽可能地减少磁盘存储,但要保持这些难以置信的响应时间,似乎很难做到平衡。我在听你的想法。

w51jfk4q

w51jfk4q1#

有很多方法可以解决这个问题。
您可以创建 Materialized Table 还有你的table。
你可以用 ReplacingMergeTree .
您可以改变(更改或更新)现有数据。
按原样使用表,但使用 groupArray 得到你想要的结果。
这里我演示第四种解决方案。你只要把数据插入 MergeTree 就像你一直做的那样。但是当你查询它时,你使用 groupArray 将所需列滚动为基于其他列的数组。
假设你的table是这样的:

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]         │
└───────┴─────────┴───────────┴───────────────┘

相关问题