无缝更改ClickHouse物化视图SELECT逻辑的方法
2021-07-29 本文已影响0人
LittleMagic
累成狗的一天,继续超短文模式。
在我司的ClickHouse DWS层有一张ReplicatedAggregatingMergeTree引擎的物化视图,为近线推荐业务提供关键用户行为的计数值。该物化视图的底表(即所谓“inner”表)有两张,分别从不同的事实表聚合数据,如下图所示。
Q:算法同学希望在物化视图中增加一些用户行为,如何在保证不影响线上业务(不删表)的前提下把这些行为加进去?
A:以mv_recommend_access_stat为例。
- 使用
DETACH TABLE
语句将底表解挂,即暂时屏蔽掉它的元数据。
DETACH TABLE rtdw_dws.mv_recommend_access_stat ON CLUSTER sht_ck_cluster_pro;
- 定位到它的元数据文件所在的路径,可以从系统表查询。
SELECT metadata_path FROM system.tables WHERE name = 'mv_recommend_access_stat';
┌─metadata_path─────────────────────────────────────────────────────────┐
│ /data1/clickhouse/data/metadata/rtdw_dws/mv_recommend_access_stat.sql │
└───────────────────────────────────────────────────────────────────────┘
- 打开上述SQL文件,修改SELECT语句如下。
ATTACH MATERIALIZED VIEW mv_recommend_access_stat TO rtdw_dws.mv_recommend_events_stat
(
`ts_date` Date,
`groupon_id` Int64,
`merchandise_id` Int64,
`event_type` String,
`event_count` AggregateFunction(count, UInt64)
) AS SELECT
ts_date,
groupon_id,
merchandise_id,
event_type,
countState(toUInt64(1)) AS event_count
FROM rtdw_dwd.analytics_access_log
WHERE event_type IN ('openDetail', 'addCart', 'buyNow', 'share', 'openAllEvaluations')
GROUP BY ts_date, groupon_id, merchandise_id, event_type
然后将修改过的文件通过scp等方式分发到集群中所有节点(重要!)
- 使用
ATTACH TABLE
语句将底表重新挂载回去。
ATTACH TABLE rtdw_dws.mv_recommend_access_stat ON CLUSTER sht_ck_cluster_pro;
观察物化视图,出现了新加入的事件计数,大功告成。民那晚安晚安。