【问题标题】:How to compare two arrays and find the the match (0/1) in an array in Clickhouse如何比较两个数组并在 Clickhouse 的数组中找到匹配项 (0/1)
【发布时间】:2021-05-16 18:09:18
【问题描述】:

Clickhouse 中的爱数组!

目前,我们正在尝试设计一个解决方案,要求我们找出 array1 中的元素是否存在于 array2 中,而不管顺序如何。

例如

array1= ['x','y','z']
array2= ['a','x','c']

Then the return that we want is [1,0,0]

  1. 是否有一种简单的开箱即用的方法来实现这一点?
  2. 这是一个更大查询的一部分,这意味着该数组比较的结果将用作 arrayMap((a,b) -> a*b, result, metric_array) 的一部分——更多的是内联过滤。
  3. 如果有任何方法可以做到这一点,性能将大大提高!

提前致谢!

【问题讨论】:

    标签: clickhouse


    【解决方案1】:

    试试这个查询:

    SELECT
        ['x', 'y', 'z'] AS a1,
        ['a', 'x', 'c'] AS a2,
        arrayMap(x -> has(a2, x), a1) AS result
    
    /*
    ┌─a1────────────┬─a2────────────┬─result──┐
    │ ['x','y','z'] │ ['a','x','c'] │ [1,0,0] │
    └───────────────┴───────────────┴─────────┘
    */
    

    这个解决方案看起来无效,但检查一下也很有意义:

    SELECT
        ['x', 'y', 'z'] AS a1,
        ['a', 'x', 'c'] AS a2,
        arrayIntersect(a1, a2) AS a3,
        arrayMap(x -> has(a3, x), a1) AS result
    
    /*
    ┌─a1────────────┬─a2────────────┬─a3────┬─result──┐
    │ ['x','y','z'] │ ['a','x','c'] │ ['x'] │ [1,0,0] │
    └───────────────┴───────────────┴───────┴─────────┘
    */
    

    【讨论】:

    • 谢谢弗拉基米尔——这太完美了。我为自己的想法感到尴尬(见下文我的 hack)。
    【解决方案2】:

    【讨论】:

    • 谢谢弗兰克。对不起,我应该更明确一点 - 在 Clickhouse 中需要这个来保存记录 >300M 的表。
    • @calgs 好的,我正在检查
    • 再次感谢弗兰克!但是你是对的,我想我正在寻找另一种方法来做这样的事情 hasAny(arr1, arr2) 返回 [arr3] 和 0 和 1。目前,如果我选择 hasAny(['x','y','z'],['a','x','c']) - 这将返回 1 而我正在寻找 [1,0 ,0]
    【解决方案3】:

    有点复杂,但肯定有效!

    WITH 
        ['x', 'y', 'z'] AS i, 
        ['a', 'x', 'c'] AS j
    SELECT arraySlice(arrayMap(m -> (m - 1), arrayEnumerateUniq(arrayConcat(j, i))), length(j) + 1) AS final
    

    一步一步的形式

    WITH 
        ['x', 'y', 'z'] AS i, 
        ['a', 'x', 'c'] AS j
    SELECT 
        arrayConcat(j, i) AS k, 
        arrayEnumerateUniq(k) AS l, 
        arrayMap(a -> (a - 1), l) AS m, 
        arraySlice(m, length(j) + 1) AS final
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-08
      • 2017-07-29
      • 1970-01-01
      相关资源
      最近更新 更多