hive與mysql的數據分區的異同

  1. 數據分區是什麼?mysql

    數據庫分區是一種物理數據庫設計技術,DBA和數據庫建模人員對其至關熟悉。
    sql

    分區把一大塊數據分紅了n小塊,這樣查詢的時候很快定位到某一小塊上,在小塊中尋址要快不少;數據庫

  2. 多大的數據量才須要分區?數據庫設計

    參考標準,若是一張表的記錄超過在超過1000w,並以每個月百萬的數據量增加,那須要分區。
    函數

  3. 爲何須要數據分區?性能

    性能提高;方便管理;避免數據傾斜優化

    改善數據庫的結構有兩種,一種是採用存儲過程代替普通的SQL語句,spa

    另一種就是使用數據庫系統中加強索引和規劃分區表進行優化,設計

    數據分區主要目的是爲了在特定的SQL操做中減小數據讀寫的總量以縮減響應時間。orm

  4. 有幾種常見的數據分區?各自的優缺點 (基於mysql)

    行分區 ----按日期的分區

    列分區--- 參數值個數比較少 國際化按國家的分區

    range分區:行數據基於屬於一個給定連續區間的列值被放入分區,mysql5.5開始支持range columns的分區。

    list分區:分區面向的是離散的值,mysql5.5支持list columns。

    hash分區:根據用戶自定義的表達式的返回值來進行分區,返回值不能爲負數。

    key分區:根據MYSQL數據庫提供的哈希函數來進行分區。

    謹記:不管使用何種類型的分區,分區老是在建立時就自動的順序編號,且從0開始記錄;

      只有RANGE和LIST支持子分區,可是子分區內只能使用HASH和KEY分區。

5.hive分區

   由於分區列的值要轉化爲文件夾的存儲路徑,

在表的數據文件中實際上並不保存分區列的信息與數據。

數據是根據文件夾的名字讀取來的,而不是實際從數據文件中讀取來的。

通常向分區表中插入數據時系統會校驗數據是否符合該分區,若是不符合會報錯。

而在hive中,向某個分區中插入什麼樣的數據徹底是由人來控制的。

動態分區能夠根據查詢獲得的數據自動匹配到相應的分區中去。

先設置hive.exec.dynamic.partition參數值爲true,默認值爲false,即不容許使用:

若是源數據對應的province子分區不存在,則會自動建立,很是方便,

並且避免了人工控制插入數據與分區的映射關係存在的潛在風險。

爲了讓分區列的值相同的數據儘可能在同一個mapreduce中,

這樣每個mapreduce能夠儘可能少的產生新的文件夾,

能夠藉助distribute by的功能,將分區列值相同的數據放到一塊兒.

附distributed by 

  ditribute by是控制map的輸出在reducer是如何劃分的,舉個例子,咱們有一張表,mid是指這個store所屬的商戶,money是這個商戶的盈利,name是這個store的名字

store: 

midmoneyname

AA15.0商店1

AA20.0商店2

BB22.0商店3

CC44.0商店4

    執行hive語句:

select mid, money, name from store distribute by mid sort by mid asc, money asc  

 咱們全部的mid相同的數據會被送到同一個reducer去處理,這就是由於指定了distribute by mid,這樣的話就能夠統計出每一個商戶中各個商店盈利的排序了(這個確定是全局有序的,由於相同的商戶會放到同一個reducer去處理)。這裏須要注意的是distribute by必需要寫在sort by以前。

相關文章
相關標籤/搜索