即席查詢UV方案
Hologres針對(duì)小規(guī)模數(shù)據(jù)量(千萬級(jí))的UV計(jì)算場(chǎng)景,提供即席UV查詢方案,支持您使用COUNT DISTINCT對(duì)明細(xì)表進(jìn)行UV計(jì)算,尤其當(dāng)您需要從原始數(shù)據(jù)中獲取最準(zhǔn)確、最即時(shí)的結(jié)果時(shí)。本方案避免了使用預(yù)聚合表或其他復(fù)雜的數(shù)據(jù)處理技術(shù),以簡(jiǎn)化查詢過程。
方案介紹
對(duì)于小規(guī)模數(shù)據(jù)量(千萬級(jí))的UV計(jì)算場(chǎng)景,在Hologres中可以使用COUNT DISTINCT直接查詢明細(xì)表,并通過篩選時(shí)間周期來實(shí)現(xiàn)任意長(zhǎng)周期的UV計(jì)算。同時(shí)Hologres對(duì)COUNT DISTINCT進(jìn)行了多種優(yōu)化,可以高效地支持單個(gè)或多個(gè)字段的COUNT DISTINCT,滿足大部分的UV計(jì)算場(chǎng)景。在明細(xì)表JOIN維表的場(chǎng)景,可以設(shè)置合理的索引來進(jìn)一步提升性能。該方案的優(yōu)缺點(diǎn)及適用場(chǎng)景如下:
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):實(shí)時(shí)性好,可以滿足用戶的實(shí)時(shí)UV計(jì)算需求,同時(shí)計(jì)算靈活,可以按需選擇時(shí)間周期進(jìn)行UV計(jì)算,無需預(yù)計(jì)算和調(diào)度等配置即可實(shí)現(xiàn)即席的UV、PV查詢。結(jié)合Hologres內(nèi)置的COUNT DISTINCT自動(dòng)優(yōu)化,計(jì)算效率相比其他產(chǎn)品有顯著提升。
缺點(diǎn):數(shù)據(jù)量變大時(shí),計(jì)算時(shí)效可能會(huì)降低,支持的QPS也會(huì)降低。
適用場(chǎng)景
適用于小規(guī)模數(shù)據(jù)量(千萬級(jí))UV查詢場(chǎng)景。
方案流程
明細(xì)寬表計(jì)算UV
若只有一張明細(xì)寬表,可以直接對(duì)UID
字段使用COUNT DISTINCT實(shí)現(xiàn)UV計(jì)算,示例如下:
準(zhǔn)備一張明細(xì)寬表
ods_app_detail
。--明細(xì)寬表 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根據(jù)需求設(shè)置,根據(jù)該表的實(shí)時(shí)查詢需求,從什么維度做分片能夠取得較好效果即可 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計(jì)算UV。
--查詢一個(gè)月的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;
明細(xì)表和維表JOIN計(jì)算UV
部分業(yè)務(wù)場(chǎng)景可能需要使用維表和明細(xì)表進(jìn)行JOIN才能實(shí)現(xiàn)UV計(jì)算,常見的示例如下:
準(zhǔn)備基礎(chǔ)表。
--明細(xì)表,記錄用戶的操作明細(xì) 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根據(jù)需求設(shè)置,根據(jù)該表的實(shí)時(shí)查詢需求,從什么維度做分片能夠取得較好效果即可 CALL set_table_property('ods_app_detail', 'distribution_key', 'uid'); --用于做where過濾條件,包含完整年月日時(shí)間字段推薦設(shè)為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;
通過明細(xì)表JOIN維表計(jì)算任意周期的UV。
--查詢一個(gè)月內(nèi)性別為男的用戶的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;