累成狗的一天,繼續超短文模式。
在我司的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;
觀察物化視圖,出現了新加入的事件計數,大功告成。民那晚安晚安。