在 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的主要内容,如果未能解决你的问题,请参考以下文章

在 pandas 中的多个列上应用自定义函数

如何在 sklearn 中一次在多个列上应用预处理方法

在 Pyspark 中的多个列上使用相同的函数重复调用 withColumn()

深度学习核心技术精讲100篇(三十)-ClickHouse在字节跳动广告业务中的应用

在插入 table2 之前,如何在 table1 的多个列上应用 count 和 distinct

如何使用 MYSQL 中的连接从多个表中获取多个列并在非空列上显示数据以及在空列上显示 null 或零