我有一张有以下DDL的桌子:
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表达式,以便在某些天数之后,相应的记录被删除。我可以很容易地做到以下几点:
ALTER TABLE default.pricing_rate_latest_state_union_test
MODIFY TTL finalizeAggregation(scraping_time) + INTERVAL 30 DAY;
这很好,但我的最终目标是添加描述过期后需要删除哪些行的条件。我想做的是:
ALTER TABLE default.pricing_rate_latest_state_union_test
MODIFY TTL finalizeAggregation(scraping_time) + INTERVAL 30 DAY
DELETE WHERE source = 'some_value';
不幸的是,这会导致以下错误:
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
根据这个文档,应该是可能的,因为有以下示例:
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
发布于 2022-04-29 19:19:36
它看起来像是一个错误或意外的行为,因为TTL不是设计用来处理AggregateFunction的。
您可以在没有位置的情况下构造TTL
ALTER TABLE default.pricing_rate_latest_state_union_test
MODIFY TTL if (source = 'some_value', finalizeAggregation(scraping_time) + INTERVAL 30 DAY, toDateTime(0));
发布于 2022-09-04 23:45:59
在调查这个案件时,发现AggregateFunction中没有这个问题。问题是,当表不为空时,Clickhouse的TTL不支持修改TTL语句中的WHERE子句。
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并通过修改再次添加,则会引发上述错误。
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版(正式构建))杀死突变。
我试过移除地方和工作地点。
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重新创建
https://stackoverflow.com/questions/72037815
复制相似问题