一種hive的模型設計思路,解決頻繁增加指標欄位的問題

shuizimuzhongling發表於2020-12-08

1場景描述:

有一張由多個維度(維度1、維度2、維度3、……)和多個指標(指標1、指標2、指標3、……)欄位構成的表(schema.tablename1),由於業務頻繁變化,經常需要增加指標,按照這種模型設計結構每次增加指標都需要修改表結構,並修改業務邏輯程式碼。

 

樣例:

欄位名

欄位描述

欄位型別

dim1

維度1

string

dim2

維度2

string

dim3

維度3

string

kpi1

指標1

double

kpi2

指標2

double

kpi3

指標3

double

 

 

2每次新增指標如何實現不修改表結構呢?

 

解決思路:

構建一個map<string,string>結構的欄位,將指標欄位名和指標欄位值都存放在這一個欄位中。

表結構樣例:

欄位名

欄位描述

欄位型別

dim1

維度1

string

dim2

維度2

string

dim3

維度3

string

kpi_value          

格式:[指標欄位名1:指標欄位值1,指標欄位名2:指標欄位值2,指標欄位名3:指標欄位值3]

map<string,string> 

 

3實現方法:

 

 

CREATE TABLE IF NOT EXISTS schema.tablename2

(

dim1       string  comment '維度1 ',

dim2       string  comment '維度2 ',

dim3       string  comment '維度3 ',

kpi_value     MAP<STRING,STRING>  comment '格式:指標欄位名1:指標欄位值1,指標欄位名2:指標欄位值2'

)  

PARTITIONED BY (

date_id string

)

ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'

COLLECTION ITEMS TERMINATED BY ','

MAP KEYS TERMINATED BY ':'

NULL DEFINED AS ""

STORED AS ORC

tblproperties ('orc.compress'='SNAPPY')

;

 

資料由橫錶轉成map結構SQL樣例:

INSERT overwrite TABLE schema.tablename2 PARTITION (date_id)

select

dim1,

dim2,

dim3,

str_to_map(concat('kpi1!',coalesce(kpi1,0),'&',

'kpi2!',coalesce(kpi2,0),'&',

'kpi3!',coalesce(kpi3,0)

),'&','!') cols_str,

date_id

from schema_tablename1

;

 

4查詢方法:

Select dim1,dim2,dim3,

sum(kpi_value["kpi1"]) as kpi1,

sum(kpi_value["kpi2"]) as kpi2,

sum(kpi_value["kpi3"]) as kpi3

from schema.tablename2

group by dim1,dim2,dim3

;

相關文章