ClickHouse-将类似条目合并到一个新条目

时间:2019-07-09 07:18:12

标签: duplicates clickhouse

这是我当前在ClickHouse中使用的模型(简化):

凭据表

  • 用户:字符串
  • 域:字符串
  • 密码:字符串
  • 泄漏:UInt64

leak字段是对泄漏ID的引用。

泄漏表

  • id:UInt64
  • 名称:字符串
  • desc:字符串
  • 日期:字符串

我正在将MergeTree引擎用于Credential,将Log用于Leak
有时会插入两个相同的凭据,因此我有例如:
|用户|域|密码0 |
|用户|域|密码1 |

我想把它变成:
|用户|域|密码[0,1] |

我已经阅读了有关ReplacecingMergeTree的信息,但是除了version参数之外,我没有找到其他方法来指定一些重写/删除规则。

我的问题是我有数十亿个条目,在插入之前处理数据听起来很疯狂。即使ClickHouse的响应时间非常短,但要检查我要插入的每个新凭据是否已经存在,以及是否更新其数据,对吗?

我正在尝试尽可能减少磁盘存储,但是在保持这些令人难以置信的响应时间的同时似乎很难平衡。我在听你的想法。

1 个答案:

答案 0 :(得分:0)

有很多方法可以解决这个问题。

  1. 您可以与实际表格一起创建Materialized Table
  2. 您可以使用ReplacingMergeTree
  3. 您可以更改(更改)现有数据。
  4. 按原样使用表,但使用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]         │
└───────┴─────────┴───────────┴───────────────┘