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 - 将数组映射到要排序的列的主要内容,如果未能解决你的问题,请参考以下文章