Duplicates ClickHouse-将类似条目合并到新条目中

Duplicates ClickHouse-将类似条目合并到新条目中,duplicates,clickhouse,Duplicates,Clickhouse,这是我在ClickHouse中的当前(简化)模型: 凭证表 用户:字符串 域:字符串 密码:String 泄漏:UInt64 字段leak是对泄漏id的引用 泄漏表 id:UInt64 名称:String 描述:字符串 日期:String 我正在将MergeTree引擎用于凭证和泄漏日志 有时会插入两个sames凭据,因此我有一个示例: |用户|域|密码| 0 | |用户|域|密码| 1 | 我想将此转换为: |用户|域|密码|[0,1]| 我已经读过关于ReplacingMergeTr

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

凭证表
  • 用户:字符串
  • 域:字符串
  • 密码:String
  • 泄漏:UInt64
字段
leak
是对泄漏id的引用

泄漏表
  • id:UInt64
  • 名称:String
  • 描述:字符串
  • 日期:String
我正在将MergeTree引擎用于
凭证
泄漏日志

有时会插入两个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有一个本地解决方案,它被称为