基本思路
- 離線部分:Hdfs的離線數(shù)據(jù)導(dǎo)入ClickHouse
- 實(shí)時(shí)部分:直接寫(xiě)入ClickHouse荐虐,使用
AggregatingMergeTree
表引擎按排序鍵合并最新數(shù)據(jù) - 查詢(xún):使用
final
關(guān)鍵字米绕,只查詢(xún)最新合并后的數(shù)據(jù) - 定時(shí)執(zhí)行
optimize
,對(duì)全表數(shù)據(jù)按排序鍵合并 - 數(shù)據(jù)下發(fā):對(duì)用戶(hù)提交的條件拆分玻淑,分別從不同的表中把數(shù)據(jù)插入下發(fā)明細(xì)表(
AggregatingMergeTree
),最終將數(shù)據(jù)按user_id去重后下發(fā) - 群組人數(shù):對(duì)用戶(hù)提交的條件拆分丢烘,分別從不同表中把user_id的bitmap查詢(xún)出來(lái)茁彭,將多組bitmap合并后返回群組人數(shù)
表結(jié)構(gòu)
寬表字段數(shù)量800+
CREATE TABLE cust_label_all_hdfs (
user_id String COMMENT '客戶(hù)賬號(hào)',
……
) ENGINE = HDFS('hdfs://xx.xx.xx.xx:8020/hive/cust_label.db/cust_label_all/stat_dt=2021-09-09/*','Parquet')
子表A字段19,數(shù)據(jù)量3000W抽米,子表B字段13特占,數(shù)據(jù)量5000W
CREATE TABLE cust_label_table_a (
user_id String COMMENT '客戶(hù)賬號(hào)',
……
) ENGINE = ReplicatedAggregatingMergeTree('/clickhouse/tables/{layer}-{shard}/cust_label/cust_label_d_member','{replica}')
ORDER BY user_id
數(shù)據(jù)下發(fā)
對(duì)用戶(hù)提交的條件拆分,分別從不同的表中把數(shù)據(jù)插入下發(fā)明細(xì)表(AggregatingMergeTree
)云茸,最終將數(shù)據(jù)按user_id去重后下發(fā)
人數(shù)統(tǒng)計(jì)
對(duì)用戶(hù)提交的條件拆分是目,分別從不同表中把user_id的Bitmap
查詢(xún)出來(lái),將多組Bitmap合并后返回群組人數(shù)
select
bitmapOrCardinality(id_bitmap_a, id_bitmap_b) as user_num
from
(
select
1 as join_id,
groupBitmapState(user_id) as id_bitmap_a
from
表A
where
條件
) T1
inner join (
select
1 as join_id,
groupBitmapState(user_id) as id_bitmap_b
from
表B
where
條件
) T2 on T1.join_id = T2.join_id
數(shù)據(jù)導(dǎo)入
子表導(dǎo)入寬表(@Deprecated)
源表使用HDFS表引擎
直接讀取hdfs中的子表标捺,目標(biāo)表建立大寬表使用AggregatingMergeTree表引擎
實(shí)現(xiàn)子表導(dǎo)入的數(shù)據(jù)按排序鍵合并
使用insert into
語(yǔ)句執(zhí)行數(shù)據(jù)導(dǎo)入
使用optimize
語(yǔ)句進(jìn)行合并胖笛,合并前執(zhí)行SET optimize_throw_if_noop = 1
可以看到合并時(shí)的異常信息
這里由于Hive中的離線數(shù)據(jù)本身子表合并大寬表已經(jīng)非常耗時(shí)了,用ClickHouse存儲(chǔ)時(shí)不必要再浪費(fèi)時(shí)間從離線大寬表
子表A導(dǎo)入結(jié)果
Elapsed: 1839.742 sec. Processed 29.87 million rows, 8.33 GB (16.23 thousand rows/s., 4.53 MB/s.)
子表B導(dǎo)入結(jié)果
Elapsed: 3731.763 sec. Processed 52.14 million rows, 13.51 GB (13.97 thousand rows/s., 3.62 MB/s.)
執(zhí)行合并結(jié)果
OPTIMIZE TABLE cust_label.cust_label_d_all FINAL
Query id: 08a04d4d-93cc-4386-8cf9-5012072ff984
Ok.
0 rows in set. Elapsed: 0.002 sec.
這里看到只執(zhí)行了0.002秒宜岛,說(shuō)明并沒(méi)有真正去合并寬表數(shù)據(jù)长踊,也沒(méi)有任何的異常,這個(gè)問(wèn)題導(dǎo)致了我們使用這種子表導(dǎo)入寬表合并數(shù)據(jù)的方案不可用
子表直接導(dǎo)入
源表使用HDFS表引擎
直接讀取hdfs中的子表萍倡,目標(biāo)表建立與hdfs表字段相同的子表
實(shí)時(shí)標(biāo)簽的表使用AggregatingMergeTree表引擎
實(shí)現(xiàn)新增的數(shù)據(jù)按排序鍵合并
子表A導(dǎo)入結(jié)果
Elapsed: 172.970 sec. Processed 29.87 million rows, 8.33 GB (172.67 thousand rows/s., 48.18 MB/s.)
子表B導(dǎo)入結(jié)果
Elapsed: 306.156 sec. Processed 52.14 million rows, 13.51 GB (170.29 thousand rows/s., 44.12 MB/s.)
執(zhí)行合并結(jié)果
子表A Elapsed: 51.150 sec.
子表B Elapsed: 83.499 sec.