一、下載源碼
首先進入網站:http://archive.cloudera.com/cdh5/cdh/5/
然後搜索 hive-1.1.0-cdh5.15.1-src
二、自定義函數
2.1 添加隨機數前綴函數
解壓之後,可以用idea打開工程,然後在目錄hive-1.1.0-cdh5.15.1/ql/src/java/org/apache/hadoop/hive/ql/udf下新建一個類UDFAddRandomPrefix
2.2 移除前綴函數
同樣的在目錄
hive-1.1.0-cdh5.15.1/ql/src/java/org/apache/hadoop/hive/ql/udf下新建一個類UDFRemoveRandomPrefix2.3 註冊函數
上面的函數類我們已經定義好了,但是要註冊一下,hive才會知道我們自己寫的兩個函數,
在類FunctionRegistry的靜態代碼塊static下添加如下代碼:
三、編譯
終端切換到hive-1.1.0-cdh5.15.1目錄
然後執行下面命令
mvn clean package -DskipTests -Phadoop-2 -Pdist
最後出現下面這個圖,說明編譯成功
四、結果
最終打包後的文件在hive-1.1.0-cdh5.15.1/packaging/target目錄下
後面直接進行部署就可以了
下圖是hive-exec模塊的編譯結果
因為我們剛剛添加的函數在hive-exec模塊下添加自定義函數的,也可以把hive-exec-1.1.0-cdh5.15.1.jar直接上傳部署好hive的lib目錄下面
五、測試函數
查看函數
show functions;
可以看到我們自己定義的兩個函數了,如下圖
我們看下函數的詳細描述,看看文檔是不是我們剛剛寫的
desc function extended add_random_prefix;
如下圖,這些不就是我們剛剛自定義函數寫的說明麼
我們來使用一下這個函數:
select add_random_prefix('hive',10);
自動給我們加上隨機數了
我們再測試一下移除隨機數
select remove_random_prefix('9_hive');
到這裡,說明我們的自定義的函數沒有問題
六、解決數據傾斜問題
數據傾斜一般發生在聚合計算的時候,由於相同的key過多導致的,導致有一個task可能會計算的很慢,導致整個job的時間很長
- 上面這個數據,是每個用戶購買的產品,現在我們要計算每個用戶總共購買了多少產品;
- 從上面的數據可以看出user3用戶比較多,如果數量再擴大幾十萬倍,進行聚合的時候會發生數據傾斜的問題了,那麼我們可以用上面兩個自定義的函數解決數據傾斜問題
6.1 先把uid打散
打散的意思就是在uid字段的值前面加上隨機數
select add_random_prefix(uid,5) as rdm_uid from user_pid;
6.2 第一次聚合
把上面一次查詢的結果作為臨時表,對打散後的uid進行第一次聚合
6.3 移除隨機數
現在可以用移除隨機數的函數,把上面的結果uid前面的隨機數進行移除
6.4 第二次聚合
把上面的結果作為臨時表,把uid作為分組條件,對cnt進行求和,就可以得到我們的結果
到此數據傾斜解決