比较 ClickHouse 行中的两个数组

Posted

技术标签:

【中文标题】比较 ClickHouse 行中的两个数组【英文标题】:Comparing two arrays in ClickHouse rows 【发布时间】:2018-09-24 12:24:17 【问题描述】:

在 ClickHouse 中比较两个数组的任何选项?

有两列colAcolB,每一列都包含一个数组。

如果有任何算法比较 ClickHouse 表中每一行的 colAcolB 中的数组,如果数组相等,则将 colC 值设置为 1,如果数组不相等,则设置 0

例如:

colA                             |  colB                            | colC
---------------------------------|----------------------------------|-----
555,571,701,707,741,1470,4965  |  555,571,701,707,741,1470,4965 |1
555,571,701,707,741,1470,4965  |  555,571,701,707,741,1470,4964 |0

【问题讨论】:

【参考方案1】:

我在ClickHouse Google Group 提出了同样的问题,并从 Denis Zhuravlev 那里得到了这个answer:

在CH 18.1.0最新版本中,2018-07-23(#2026):

select [111,222] A,  [111,222] B, [111,333] C, A=B ab, A=C ac

结果

┌─A─────────┬─B─────────┬─C─────────┬─ab─┬─ac─┐
│ [111,222] │ [111,222] │ [111,333] │  1 │  0 │
└───────────┴───────────┴───────────┴────┴────┘

在 18.1.0 之前你可以使用 lambdas 什么的:

SELECT 
   NOT has(groupArray(A = B), 0) ab
  ,NOT has(groupArray(A = C), 0) ac
  FROM
    (
      SELECT
         [111,222] A
        ,[111,222] B
        ,[111,333] C
    )
    ARRAY JOIN
         A
        ,B
        ,C 


┌─ab─┬─ac─┐
│  1 │  0 │
└────┴────┘

【讨论】:

【参考方案2】:

我认为现在平等有效 20.3.5.21

Cloud10 :) SELECT [2,1] = [1,2]

SELECT [2, 1] = [1, 2]

┌─equals([2, 1], [1, 2])─┐
│                      0 │
└────────────────────────┘

1 rows in set. Elapsed: 0.003 sec. 

Cloud10 :) SELECT [2,1] = [2,1]

SELECT [2, 1] = [2, 1]

┌─equals([2, 1], [2, 1])─┐
│                      1 │
└────────────────────────┘

1 rows in set. Elapsed: 0.003 sec. 

【讨论】:

以上是关于比较 ClickHouse 行中的两个数组的主要内容,如果未能解决你的问题,请参考以下文章

ClickHouse SQL 极简教程ClickHouse SQL 之数据控制语言 DCL

ClickHouse 创建用户/角色/行权限策略/配额 Quota 限流等

ClickHouse中两个字符串的比较

功能与 clickhouse 中的滞后分区相同

错误:无法初始化类 ru.yandex.clickhouse.ClickHouseUtil

Flink SQL实战演练之自定义Clickhouse Connector