hive數據倉庫表設計之(矮寬表+高窄表)


昨天面對某客戶域做表關聯的時候發現了。

有兩張相同內容的主表。但是表的設計結構並不相同:

(每個領域都有主表,每次往這個領域(庫)添加新表的時候一般都會join 主表,從而有唯一的主鍵id)

這兩個表提供了這個領域的主鍵(id).

在這個

+------------+------------+----------+--+
| col_name | data_type | comment |
+------------+------------+----------+--+
| id      | int | |
| name   | string | |
| phone   | string | |
| gender   | string | |
| cardno  | string | |
| age    | string | |
| school   | string | |
| quora    | int | |

..

...

..

目測有60個字段這是一張寬表.
+------------+------------+----------+--+

 

 

+------------+------------+----------+--+
| col_name | data_type | comment |
+------------+------------+----------+--+
| id      | int | |
| value1  | string | |
| type1  | string | |
| value2  | string | |
| type2  | string | |
| age    | string | |
| school   | string | |
| quora    | int | |

 

目測有不到10個字段
+------------+------------+----------+--+

這是一張窄表

 

select type1,type2 from thistable group by type1,typ2;

發現類型數據有14種類左右

這樣就相當於把第一個寬表的數據(可能剔除了不重要的字段)然后完全放開,行數暴增。

 ==============================================================================

我講一下怎么用設計性能原理還要留給大家去分析:

每次都要從其他表抽取數據關聯這個表id(唯一主鍵),比如這個第三方表名字叫第三方客戶信息 沒有id這列(畢竟id列是我們在自己的系統自己生成的),

只有用戶名和手機號+(第三方提供的字段(比如一周洗幾次澡)),我們用name+ phone去作為join on的條件關聯主表窄表,得到新的有主鍵的表。

select id ,max(a.字段) from 第三方表 a

join

(select id,value1 as phone,value2 as name from 主表窄表 where type1=‘MOBILE_PHONE’  and type2='NAME' group by id,value1,value2) b

on a.phone=b.phone and a.name=b.name

group by id.

note:上面的group by 的作用主要是為了去重。

 

 

但是為什么這樣設計?這又是對內存和計算效率(時間)之間的權衡

應該是減少對內存的需求。因為join關聯必定要生成一個中間表。如果是寬表內存太大,但是窄表犧牲了關聯效率。畢竟行數倍增原來十多倍。關於join的原理請看我另一份博客。

 年前和項目老大聊了一會。他設計這個報表。感覺大佬的想法很nice。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM