首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有WHERE条件的ClickHouse TTL设置

具有WHERE条件的ClickHouse TTL设置
EN

Stack Overflow用户
提问于 2022-04-28 03:48:34
回答 2查看 538关注 0票数 0

我有一张有以下DDL的桌子:

代码语言:javascript
运行
复制
CREATE TABLE default.pricing_rate_latest_state_union_test
(
    `organization_id`   Int32,
    `organization_name` String,
    `scraping_time`     AggregateFunction(max, DateTime),
    `amount_from_raw`   Float64,
    `amount_to_raw`     Float64,
    `key_param_id`      LowCardinality(String),
    `amount_from`       AggregateFunction(argMax, Float64, DateTime),
    `amount_to`         AggregateFunction(argMax, Float64, DateTime),
    `source`            LowCardinality(String)
)
ENGINE = ReplicatedAggregatingMergeTree('/clickhouse/tables/{shard}/*****/pricing_rate_latest_state_union_test',
 '{replica}')
ORDER BY (key_param_id,
 amount_from_raw,
 amount_to_raw)
SETTINGS index_granularity = 8192;

为此,我想在scraping_time列上添加一个TTL表达式,以便在某些天数之后,相应的记录被删除。我可以很容易地做到以下几点:

代码语言:javascript
运行
复制
ALTER TABLE default.pricing_rate_latest_state_union_test 
MODIFY TTL finalizeAggregation(scraping_time) + INTERVAL 30 DAY;

这很好,但我的最终目标是添加描述过期后需要删除哪些行的条件。我想做的是:

代码语言:javascript
运行
复制
ALTER TABLE default.pricing_rate_latest_state_union_test 
MODIFY TTL finalizeAggregation(scraping_time) + INTERVAL 30 DAY 
DELETE WHERE source = 'some_value';

不幸的是,这会导致以下错误:

代码语言:javascript
运行
复制
 DB::Exception: Exception happened during execution of mutation '0000000000' with part 'all_0_0_0' reason: 'Code: 10, e.displayText() = DB::Exception: Not found column scraping_time in block. There are only columns: organization_id (version 21.8.13.6 (official build))'. This error maybe retryable or not. In case of unretryable error, mutation can be killed with KILL MUTATION query 

根据这个文档,应该是可能的,因为有以下示例:

代码语言:javascript
运行
复制
CREATE TABLE table_with_where
(
    d DateTime,
    a Int
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(d)
ORDER BY d
TTL d + INTERVAL 1 MONTH DELETE WHERE toDayOfWeek(d) = 1;

我相信,由于ReplicatedAggregatingMergeTree的原因,我的情况不太顺利,所以这里的任何帮助都将是非常感谢的。

我还对在块中找不到列scraping_time的含义感兴趣。我知道在ClickHouse中是什么部分,但是块是什么,为什么它没有看到scraping_time,但是看到了organization_id

EN

回答 2

Stack Overflow用户

发布于 2022-04-29 19:19:36

它看起来像是一个错误或意外的行为,因为TTL不是设计用来处理AggregateFunction的。

您可以在没有位置的情况下构造TTL

代码语言:javascript
运行
复制
ALTER TABLE default.pricing_rate_latest_state_union_test  
  MODIFY TTL if (source = 'some_value', finalizeAggregation(scraping_time) + INTERVAL 30 DAY, toDateTime(0));
票数 0
EN

Stack Overflow用户

发布于 2022-09-04 23:45:59

在调查这个案件时,发现AggregateFunction中没有这个问题。问题是,当表不为空时,Clickhouse的TTL不支持修改TTL语句中的WHERE子句。

代码语言:javascript
运行
复制
CREATE TABLE test
(
    `scraping_time` AggregateFunction(max,
 DateTime),
    `source` String
)
ENGINE = ReplicatedAggregatingMergeTree('/clickhouse/tables/{shard}/test',
 '{replica}')
ORDER BY (source)
TTL finalizeAggregation(scraping_time) + toIntervalDay(if(source='condition1', 30, 40)) where source <> 'condition2'
SETTINGS index_granularity = 8192;

这个很管用。在填满那张桌子之后。然后,如果您尝试删除TTL并通过修改再次添加,则会引发上述错误。

代码语言:javascript
运行
复制
ALTER TABLE test REMOVE TTL;

ALTER TABLE test MODIFY TTL scraping_time + toIntervalDay(if(source='scraper', 30, 40)) where source <> 'stable';

SQL 341: ClickHouse异常,代码: 341,主机:*,端口:*;代码: 341,e.displayText() =DB::all___0:异常发生在执行变异'0000000000‘时,部分原因是:'all___0’原因:‘代码: 10,e.displayText() =DB:异常:未找到块列scraping_time。只有列: organization_id (版本21.8.14.5 (正式构建))。这个错误可能是可还原的,也可能不是可还原的。在出现不可还原错误的情况下,可以使用杀死突变查询( 21.8.14.5版(正式构建))杀死突变。

我试过移除地方和工作地点。

代码语言:javascript
运行
复制
ALTER TABLE test MODIFY TTL finalizeAggregation(scraping_time) + toIntervalDay(if(source='condition1', 30, 40));

下面是三种解决方案

1.正如Denny所描述的,当您修改TTL时不要使用它,您可以用multiIf或多个ifs替换它

2.将数据复制到临时表,截断要添加TTL的表,添加TTL (必须使用WHERE语句),将数据复制回主表

3.不推荐。删除表,然后在CREATE语句中使用TTL重新创建

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72037815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档