在clickhouse中更改阵列结构的更快方法

mm9b1k5b  于 2021-07-15  发布在  ClickHouse
关注(0)|答案(2)|浏览(437)

我想知道是否有一种更快的方法来完成我下面要做的事情——基本上,取消数组的测试并创建一个具有不同列的grouparray。

-- create table

CREATE TABLE default.t15 ( product String,  indx Array(UInt8),  col1 String,  col2 Array(UInt8)) ENGINE = Memory ;

--insert values

INSERT into t15 values ('p',[1,2,3],'a',[10,20,30]),('p',[1,2,3],'b',[40,50,60]),('p',[1,2,3],'c',[70,80,90]);

-- select values
    SELECT * from t15;
┌─product─┬─indx────┬─col1─┬─col2───────┐
│ p       │ [1,2,3] │ a    │ [10,20,30] │
│ p       │ [1,2,3] │ b    │ [40,50,60] │
│ p       │ [1,2,3] │ c    │ [70,80,90] │
└─────────┴─────────┴──────┴────────────┘

期望输出

┌─product─┬─indx_list─┬─col1_arr──────┬─col2_arr───┐
│ p       │         1 │ ['a','b','c'] │ [10,40,70] │
│ p       │         2 │ ['a','b','c'] │ [20,50,80] │
│ p       │         3 │ ['a','b','c'] │ [30,60,90] │
└─────────┴───────────┴───────────────┴────────────┘

我是怎么做的->[有点慢我需要这个]

SELECT   product, 
         indx_list, 
         groupArray(col1)      col1_arr, 
         groupArray(col2_list) col2_arr 
FROM     ( 
                  SELECT   product, 
                           indx_list, 
                           col1, 
                           col2_list 
                  FROM     t15 
                  ARRAY JOIN
                           indx AS indx_list, 
                           col2 AS col2_list 
                  ORDER BY indx_list, 
                           col1
          )x 
GROUP BY product, 
         indx_list;

基本上,我正在取消数组的测试,然后将它们分组回来。有没有更好更快的方法来做到这一点。
谢谢!

rggaifut

rggaifut1#

如果你想让它更快,它看起来像你可以避免subselect和全局顺序。比如:

SELECT 
    product, 
    indx_list, 
    groupArray(col1) AS col1_arr, 
    groupArray(col2_list) AS col2_arr
FROM t15 
ARRAY JOIN 
    indx AS indx_list, 
    col2 AS col2_list
GROUP BY 
    product, 
    indx_list

如果需要对数组进行排序,通常最好在每个组中分别使用arraysort对其进行排序。

kr98yfug

kr98yfug2#

我将使查询变得简单一些,以将数组联接的计数减少到1,这可能会提高性能:

SELECT
    product,
    index as indx_list,
    groupArray(col1) as col1_arr,
    groupArray(element) as col2_arr
FROM
(
    SELECT
        product,
        arrayJoin(indx) AS index,
        col1,
        col2[index] AS element
    FROM default.t15
)
GROUP BY
    product,
    index;

也许改变表结构以去掉任何数组是有意义的。我建议采用平面模式:

CREATE TABLE default.t15 ( 
  product String,  
  valueId UInt8,  /* indx */
  col1 String, /* col1 */
  value UInt8) /* col2 */
  ENGINE = Memory ;

相关问题