Clickhouse将数据从一个表聚合到另一表

时间:2020-07-08 04:46:46

标签: sql view aggregate materialize clickhouse

我正试图解决这个问题:

给出一个 input_table

> app_name, user_id, state, timestamp \
> App1 ,   user1   , open,  1 \
> App1 ,   user1   , close, 2 \
> App2 ,   user2   , open,  3 \
> App1 ,   user4   , open,  4 \
> App2 ,   user3   , open,  5 

我想使用MV来更新用户和应用程序状态映射,例如以下 output_table

> App1 , [user4] -- user1 is closed \
> App2 , [user2, user3]

output_table 应该在将数据插入 input_table 时立即进行更新。

当我在 input_table 中有传入数据时:

> App1, user5, open, 6 \
> App1, user1, open, 7

预期输出表如下:

> App1 , [user4, user5, user1] \
> App2 , [user2, user3]

我有一个非常幼稚的解决方案版本,但是它进行了批量更新,并且需要表扫描数据来重建映射。 我们有什么办法可以在短时间内解决部分问题,或者每插入一行更新一次。我认为 Materialize View 可以提供帮助,但是我不确定在input_table中每次插入都会更新输出表

2 个答案:

答案 0 :(得分:1)

在执行GroupBy时,如果您在增量交易中执行,则结果数据集将应用于该增量部分,而不是整个数据,因此,如果您的数据量不大,则在整个表格如下

SELECT app_name, GROUP_CONCAT(user_id) AS combined
FROM T
GROUP BY app_name

答案 1 :(得分:0)

在使用物化视图之前,我建议对原始数据使用查询。为了加快此查询的速度,请考虑在 WHERE 子句中定义日期范围。

SELECT app_name, groupArray(user_id) users
FROM (
  SELECT app_name, user_id, argMax(state, timestamp) last_state
  FROM input_table
  WHERE timestamp BETWEEN 1 AND 11 /* <-- restrict the date range */
  GROUP BY app_name, user_id
  HAVING last_state != 'close')
GROUP BY app_name

/* result for 1st dataset
┌─app_name─┬─users─────────────┐
│ App1     │ ['user4']         │
│ App2     │ ['user3','user2'] │
└──────────┴───────────────────┘
*/

如果此查询运行缓慢,则需要使用汇总的物化视图