Clickhouse - 将数组映射到要排序的列

Posted

技术标签:

【中文标题】Clickhouse - 将数组映射到要排序的列【英文标题】:Clickhouse - Split arrayMap to colums to sort on 【发布时间】:2021-01-15 09:54:45 【问题描述】:

我有一个 Clickhouse 查询问题,我对 Clickhouse 很陌生,所以对于专家来说这可能是一个简单的问题;)!我们有一个包含事件的表,每个事件都链接到一个产品 fe product_click、product_view。我想提取按产品分组的数据,但在一行中,我需要将所有类型的事件放在一个单独的列中,以便对其进行排序。

我已经写了这个查询:

SELECT product_id,
       arrayMap((x, y) -> (x, y),
       (arrayReduce('sumMap', [(groupArrayArray([event_type]) as arr)], 
       [arrayResize(CAST([], 'Array(UInt64)'), length(arr), toUInt64(1))]) as s).1, s.2) events
FROM events
GROUP BY product_id

结果:

┌─────────────────────────product_id───┬─events─────────────────────────────────────────────────────────────────────────────────────┐
│ 0071f1e4-a484-448e-8355-64e2fea98fd5 │ [('PRODUCT_CLICK',1341),('PRODUCT_VIEW',11)]                           │
│ 406f4707-6bad-4d3f-9544-c74fdeb1e09d │ [('PRODUCT_CLICK',1),('PRODUCT_VIEW',122),('PRODUCT_BUY',37)]    │
│ 94566b6d-6e23-4264-ad76-697ffcfe60c4 │ [('PRODUCT_CLICK',1027),('PRODUCT_VIEW',7)]                            │
...

有什么方法可以将 arrayMap 转换为带有排序键的列? 所以我们可以先筛选点击次数最多的产品,还是查看次数最多的产品?

另一个问题,让这种查询始终执行是个好主意,还是我们应该为它创建一个 MATERIALIZED 视图?

谢谢!

【问题讨论】:

【参考方案1】:

SQL 不允许可变数量的列。

唯一的办法

SELECT product_id,
       countIf(event_type = 'PRODUCT_CLICK') PRODUCT_CLICK,
       countIf(event_type = 'PRODUCT_VIEW') PRODUCT_VIEW,
       countIf(event_type = 'PRODUCT_BUY') PRODUCT_BUY
FROM events
GROUP BY product_id

【讨论】:

好吧 ;-)!感谢您的回复!

以上是关于Clickhouse - 将数组映射到要排序的列的主要内容,如果未能解决你的问题,请参考以下文章

在Informatica云中映射任务输出中的列排序

未排序数组中的密集秩 (Clickhouse)

将对象数组映射到数据表的列

用名称中的句点重命名clickhouse中的列

基于多个列对包含numpy文本数组中的数字的列进行排序

排序算法系列——直接插入排序