Duplicates ClickHouse-将类似条目合并到新条目中
这是我在ClickHouse中的当前(简化)模型: 凭证表Duplicates ClickHouse-将类似条目合并到新条目中,duplicates,clickhouse,Duplicates,Clickhouse,这是我在ClickHouse中的当前(简化)模型: 凭证表 用户:字符串 域:字符串 密码:String 泄漏:UInt64 字段leak是对泄漏id的引用 泄漏表 id:UInt64 名称:String 描述:字符串 日期:String 我正在将MergeTree引擎用于凭证和泄漏日志 有时会插入两个sames凭据,因此我有一个示例: |用户|域|密码| 0 | |用户|域|密码| 1 | 我想将此转换为: |用户|域|密码|[0,1]| 我已经读过关于ReplacingMergeTr
- 用户:字符串
- 域:字符串
- 密码:String
- 泄漏:UInt64
leak
是对泄漏id的引用
泄漏表
- id:UInt64
- 名称:String
- 描述:字符串
- 日期:String
凭证
和泄漏日志
有时会插入两个sames凭据,因此我有一个示例:
|用户|域|密码| 0 |
|用户|域|密码| 1 | 我想将此转换为:
|用户|域|密码|[0,1]| 我已经读过关于ReplacingMergeTree的内容,但是除了
version
参数之外,我没有找到其他方法来指定重写/删除规则
我的问题是我有数以十亿计的条目,在插入之前处理数据听起来很疯狂。即使ClickHouse的响应时间非常低,但检查我尝试插入的每个新凭证是否都已经存在,如果已经存在,则更新其数据,这似乎很荒谬,对吗
我试图尽可能地减少磁盘存储,但看起来很难在保持这些难以置信的响应时间的同时平衡它。我在听你的想法。有很多方法可以解决这个问题
物化表
,与实际表一起使用ReplacingMergeTree
groupArray
查询表以获得所需的结果MergeTree
。但是当您查询它时,您可以使用groupArray
将所需列滚动为基于其他列的数组
假设您的桌子是这样的:
选择*
来自mem
┌─A.─────┬─B───────┬─C─────────┬─D─┐
│ 用户1│ 域1│ 密码1│ 0│
│ 用户1│ 域1│ 密码1│ 1.│
│ 用户2│ 域2│ 密码2│ 0│
│ 用户2│ 域2│ 密码2│ 2.│
└───────┴─────────┴───────────┴───┘
您可以使用groupArray
解决您的问题:
选择a、b、c、groupArray(d)
来自mem
a、b、c分组
┌─A.─────┬─B───────┬─C─────────┬─分组数组(d)─┐
│ 用户2│ 域2│ 密码2│ [0,2] │
│ 用户1│ 域1│ 密码1│ [0,1] │
└───────┴─────────┴───────────┴───────────────┘
有很多方法可以解决这个问题
物化表
,与实际表一起使用ReplacingMergeTree
groupArray
查询表以获得所需的结果MergeTree
。但是当您查询它时,您可以使用groupArray
将所需列滚动为基于其他列的数组
假设您的桌子是这样的:
选择*
来自mem
┌─A.─────┬─B───────┬─C─────────┬─D─┐
│ 用户1│ 域1│ 密码1│ 0│
│ 用户1│ 域1│ 密码1│ 1.│
│ 用户2│ 域2│ 密码2│ 0│
│ 用户2│ 域2│ 密码2│ 2.│
└───────┴─────────┴───────────┴───┘
您可以使用groupArray
解决您的问题:
选择a、b、c、groupArray(d)
来自mem
a、b、c分组
┌─A.─────┬─B───────┬─C─────────┬─分组数组(d)─┐
│ 用户2│ 域2│ 密码2│ [0,2] │
│ 用户1│ 域1│ 密码1│ [0,1] │
└───────┴─────────┴───────────┴───────────────┘
请给我看一个表格定义示例和一个插入示例,以确保我能很好地理解它?因为在我看来,数据仍然存储了两次,而不是once@Chocorean,是的,数据仍存储在多行中。如果只需要一行,可以使用ReplacingMergeTree
。它不会按问题解决。CLickHouse没有一个本机解决方案,我需要一种自定义的“替换规则”。但是nvm,我目前正在检查是否存在,然后再插入。@Chocorean实际上Clickhouse有一个本机解决方案,它叫做AggregatingMergeTree
。问题是,您的数据类型是array,我无法使其在AggregatingMergeTree
中将列聚合为array。正在处理它。是的,我的问题是我无法指定每次引擎聚合数据时应用的规则。。。如果能看到这种功能,那就太好了!请给我看一个表定义的例子和一个插入的例子,以确保我能很好地理解它?因为在我看来,数据仍然存储了两次,而不是once@Chocorean,是的,数据仍存储在多行中。如果只需要一行,可以使用ReplacingMergeTree
。它不会按问题解决。CLickHouse没有一个本机解决方案,我需要一种自定义的“替换规则”。但是nvm,在插入之前我正在检查是否存在。@Chocorean实际上Clickhouse有一个本地解决方案,它被称为