在 Clickhouse 中的多个列上应用 argMax
Posted
技术标签:
【中文标题】在 Clickhouse 中的多个列上应用 argMax【英文标题】:Apply argMax over multiple columns in Clickhouse 【发布时间】:2021-08-19 14:31:04 【问题描述】:我的 Clickhouse 表有一个主键列 (pk
)、一个插入时间戳列 (insert_ts
) 和一堆数据列。我想获取每个数据列的最新值。我的查询可能如下所示:
SELECT pk, argMax(data1, insert_ts), argMax(data2, insert_ts), ... GROUP BY pk
这非常冗长,我更喜欢使用带有 EXCEPT/APPLY 的通配符,如下所示:
SELECT * EXCEPT(insert_ts) APPLY(argMax) GROUP BY pk
但我无法指定argMax
的第二个参数。有什么想法吗?
我对这个特定问题的答案以及对 XY 问题的答案都感兴趣,这些答案提出了一种不同的方式来构建我的表格。
【问题讨论】:
不可能github.com/ClickHouse/ClickHouse/issues/27877 【参考方案1】:感谢 Clickhouse 团队快速实施解决方案!
SELECT * EXCEPT(insert_ts) APPLY(x->argMax(x,insert_ts)) GROUP BY pk
对于 XY 问题,Clickhouse 提供了 ReplacingMergeTree 引擎,用于明确保留最新的行:
https://altinity.com/blog/2020/4/14/handling-real-time-updates-in-clickhouse https://kb.altinity.com/engines/mergetree-table-engine-family/replacingmergetree【讨论】:
最新的行只保留在一个分区内,并在分区中合并部分后。如果你有大分区或频繁插入或同时插入多个分区,你将面临ReplacingMergeTree中具有相同PK的多行。而且,当然,这些东西只在一个分片内有效。以上是关于在 Clickhouse 中的多个列上应用 argMax的主要内容,如果未能解决你的问题,请参考以下文章
在 Pyspark 中的多个列上使用相同的函数重复调用 withColumn()
深度学习核心技术精讲100篇(三十)-ClickHouse在字节跳动广告业务中的应用