Hologres針對小規模數據量(千萬級)的UV計算場景,提供即席UV查詢方案,支持您使用COUNT DISTINCT對明細表進行UV計算,尤其當您需要從原始數據中獲取最準確、最即時的結果時。本方案避免了使用預聚合表或其他復雜的數據處理技術,以簡化查詢過程。
方案介紹
對于小規模數據量(千萬級)的UV計算場景,在Hologres中可以使用COUNT DISTINCT直接查詢明細表,并通過篩選時間周期來實現任意長周期的UV計算。同時Hologres對COUNT DISTINCT進行了多種優化,可以高效地支持單個或多個字段的COUNT DISTINCT,滿足大部分的UV計算場景。在明細表JOIN維表的場景,可以設置合理的索引來進一步提升性能。該方案的優缺點及適用場景如下:
優缺點
優點:實時性好,可以滿足用戶的實時UV計算需求,同時計算靈活,可以按需選擇時間周期進行UV計算,無需預計算和調度等配置即可實現即席的UV、PV查詢。結合Hologres內置的COUNT DISTINCT自動優化,計算效率相比其他產品有顯著提升。
缺點:數據量變大時,計算時效可能會降低,支持的QPS也會降低。
適用場景
適用于小規模數據量(千萬級)UV查詢場景。
方案流程
明細寬表計算UV
若只有一張明細寬表,可以直接對UID
字段使用COUNT DISTINCT實現UV計算,示例如下:
準備一張明細寬表
ods_app_detail
。--明細寬表 BEGIN; CREATE TABLE IF NOT EXISTS ods_app_detail ( uid int, country text, prov text, city text, channel text, operator text, brand text, ip text, click_time text, year text, month text, day text, ymd text NOT NULL ); CALL set_table_property('ods_app_detail', 'orientation', 'column'); CALL set_table_property('ods_app_detail', 'bitmap_columns', 'country,prov,city,channel,operator,brand,ip,click_time, year, month, day, ymd'); --distribution_key根據需求設置,根據該表的實時查詢需求,從什么維度做分片能夠取得較好效果即可 CALL set_table_property('ods_app_detail', 'distribution_key', 'uid'); CALL set_table_property('ods_app_detail', 'clustering_key', 'ymd'); CALL set_table_property('ods_app_detail', 'event_time_column', 'ymd'); COMMIT;
使用COUNT DISTINCT計算UV。
--查詢一個月的UV、PV SELECT COUNT (DISTINCT uid) AS uv, country, prov, city, COUNT(1) AS pv FROM public.ods_app_detail WHERE ymd >= '20240301' AND ymd <= '20240331' GROUP BY country,prov,city;
明細表和維表JOIN計算UV
部分業務場景可能需要使用維表和明細表進行JOIN才能實現UV計算,常見的示例如下:
準備基礎表。
--明細表,記錄用戶的操作明細 BEGIN; CREATE TABLE IF NOT EXISTS ods_app_detail ( uid int, channel text, operator text, brand text, ip text, click_time text, year text, month text, day text, ymd text NOT NULL ); CALL set_table_property('ods_app_detail', 'orientation', 'column'); CALL set_table_property('ods_app_detail', 'bitmap_columns', 'channel,operator,brand,ip,click_time, year, month, day, ymd'); --distribution_key根據需求設置,根據該表的實時查詢需求,從什么維度做分片能夠取得較好效果即可 CALL set_table_property('ods_app_detail', 'distribution_key', 'uid'); --用于做where過濾條件,包含完整年月日時間字段推薦設為clustering_key和event_time_column CALL set_table_property('ods_app_detail', 'clustering_key', 'ymd'); CALL set_table_property('ods_app_detail', 'event_time_column', 'ymd'); COMMIT; --維表,記錄用戶的屬性信息 BEGIN; CREATE TABLE dim_uid_info ( uid int NOT NULL, name text NOT NULL, gender text NOT NULL, country text, prov text, city text ); CALL set_table_property('dim_uid_info', 'orientation', 'column'); CALL set_table_property('dim_uid_info', 'bitmap_columns', 'country,prov,city'); CALL set_table_property('dim_uid_info', 'distribution_key', 'uid'); COMMIT;
通過明細表JOIN維表計算任意周期的UV。
--查詢一個月內性別為男的用戶的UV、PV SELECT COUNT (DISTINCT B.uid) AS uv, country, prov, city, COUNT(1) AS pv FROM ( SELECT uid,country,prov,city FROM dim_uid_info WHERE gender = 'man' ) AS A LEFT JOIN ods_app_detail AS B ON A.uid = B.uid WHERE B.ymd >= '20240301' AND B.ymd <= '20240331' GROUP BY country,prov,city;
文檔內容是否對您有幫助?