问题描述
让我们说我们正在使用此表:
create table table1 (
ingestion_time DateTime,ingestion_day Date,dim1 String,met1 double,...
)
engine=ReplicatedMergeTree(...),partition=(ingestion_day)
order by = (...);
我们有一个用例,我们需要每15分钟创建一个新零件,然后对于一个正在运行的窗口(称为更新窗口),可能需要删除并重新创建某些15分钟的零件。
例如,如果更新窗口为15天,我可以在2020-10-20上选择删除2020-10-15 23:45的零件并重新摄取。
如果我按15分钟的间隔进行分区,那么它将很快导致过多的分区问题,因此我正在寻找一种方法来对合并在MergeTree中的部件进行精细控制,从而可以使15分钟的部件在更新中保持不变可以手动调用该窗口,将较旧的部分合并到每日分区中。
关于如何实现此目标的任何建议?我找不到任何可以控制零件合并的设置,尽管有些设置可用于保留已合并的旧零件。
解决方法
合并是不可管理的,它发生在后台的未知时间,因此您无法为此进行计划。有OPTIMIZE语句可初始化最终完成的计划外合并。
从理论上讲,可以定义任意分区大小,包括15分钟。但这可能是一个坏方法,取决于具体情况。
..
PARTITION BY toStartOfFifteenMinutes(ingestion_time)
..
为避免出现错误“单个INSERT块的分区过多”,需要增加参数max_partitions_per_insert_block的限制。
并通过调用DROP PARTITION删除过时的分区。
可以考虑使用mutations删除过时的行作为替代方法,但这通常是无效且不推荐的方法。
查看ReplicatedReplacingMergeTree或ReplicatedCollapsingMergeTree,以通过CH手段对数据进行重复数据删除/折叠。
可以通过TTL子句在列或表级别定义保留策略。