Hive 高级编程??深入浅出学Hive
生活随笔
收集整理的這篇文章主要介紹了
Hive 高级编程??深入浅出学Hive
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄:
初始Hive
Hive安裝與配置
Hive 內建操作符與函數開發
Hive JDBC
hive參數
Hive 高級編程
Hive QL
Hive Shell 基本操作
hive 優化
Hive體系結構
Hive的原理
?
配套視頻課程
?
第一部分:產生背景 產生背景 為了滿足客戶個性化的需求,Hive被設計成一個很開放的系統,很多內容都支持用戶定制,包括: 文件格式:Text File,Sequence File 內存中的數據格式: Java Integer/String, Hadoop? IntWritable/Text 用戶提供的 map/reduce 腳本:不管什么語言,利用 stdin/stdout 傳輸數據 用戶自定義函數 自定義函數 雖然Hive提供了很多函數,但是有些還是難以滿足我們的需求。因此Hive提供了自定義函數開發 自定義函數包括三種UDF、UADF、UDTF UDF(User-Defined-Function) UDAF(User- Defined Aggregation Funcation) UDTF(User-Defined Table-Generating Functions)? 用來解決?輸入一行輸出多行(On-to-many maping)?的需求。? HIVE中使用定義的函數的三種方式 在HIVE會話中add 自定義函數的jar文件,然后創建function,繼而使用函數 在進入HIVE會話之前先自動執行創建function,不用用戶手工創建 把自定義的函數寫到系統函數中,使之成為HIVE的一個默認函數,這樣就不需要create temporary function 第二部分:UDF UDF用法 UDF(User-Defined-Function) UDF函數可以直接應用于select語句,對查詢結構做格式化處理后,再輸出內容 編寫UDF函數的時候需要注意一下幾點 自定義UDF需要繼承org.apache.hadoop.hive.ql.UDF 需要實現evaluate函數 evaluate函數支持重載 UDF只能實現一進一出的操作,如果需要實現多進一出,則需要實現UDAF UDF用法代碼示例 import?org.apache.Hadoop.hive.ql.exec.UDF ?? public? class?Helloword? extends?UDF{ ?? public?String?evaluate(){ ?? return?"hello?world!"; ?? } ?? public?String?evaluate(String?str){ ?? return?"hello?world:?"?+?str; ?? } ?? } 開發步驟 開發代碼 把程序打包放到目標機器上去 進入hive客戶端 添加jar包:hive>add jar /run/jar/udf_test.jar; 創建臨時函數:hive>CREATE TEMPORARY FUNCTION my_add AS 'com.hive.udf.Add ‘ 查詢HQL語句: SELECT my_add (8, 9) FROM scores; SELECT my_add (scores.math, scores.art) FROM scores; 銷毀臨時函數:hive> DROP TEMPORARY FUNCTION my_add ; 細節 在使用UDF的時候,會自動進行類型轉換,例如:SELECT my_add (8,9.1) FROM scores; 結果是17.1,UDF將類型為Int的參數轉化成double。類型的飲食轉換是通過UDFResolver來進行控制的 第三部分:UDAF UDAF Hive查詢數據時,有些聚類函數在HQL沒有自帶,需要用戶自定義實現 用戶自定義聚合函數: Sum, Average…… n – 1 UDAF(User- Defined Aggregation Funcation)? 用法 一下兩個包是必須的import org.apache.hadoop.hive.ql.exec.UDAF和 org.apache.hadoop.hive.ql.exec.UDAFEvaluator 開發步驟 函數類需要繼承UDAF類,內部類Evaluator實UDAFEvaluator接口 Evaluator需要實現 init、iterate、terminatePartial、merge、terminate這幾個函數 a)init函數實現接口UDAFEvaluator的init函數。 b)iterate接收傳入的參數,并進行內部的輪轉。其返回類型為boolean。 c)terminatePartial無參數,其為iterate函數輪轉結束后,返回輪轉數據,terminatePartial類似于hadoop的Combiner。 d)merge接收terminatePartial的返回結果,進行數據merge操作,其返回類型為boolean。 e)terminate返回最終的聚集函數結果。 執行步驟 執行求平均數函數的步驟 a)將java文件編譯成Avg_test.jar。 b)進入hive客戶端添加jar包: hive>add jar /run/jar/Avg_test.jar。 c)創建臨時函數: hive>create temporary function avg_test 'hive.udaf.Avg'; d)查詢語句: hive>select avg_test(scores.math) from scores; e)銷毀臨時函數: hive>drop temporary function avg_test; UDAF代碼示例 public class MyAvg extends UDAF { public static class AvgEvaluator implements UDAFEvaluator { } public void init() {} public boolean iterate(Double o) {} public AvgState terminatePartial() {} public boolean terminatePartial(Double o) {?} public Double terminate() {} } 第四部分:UDTF UDTF UDTF(User-Defined Table-Generating Functions)? 用來解決?輸入一行輸出多行(On-to-many maping)?的需求。 開發步驟 UDTF步驟: 必須繼承org.apache.Hadoop.hive.ql.udf.generic.GenericUDTF 實現initialize, process, close三個方法 UDTF首先會 調用initialize方法,此方法返回UDTF的返回行的信息(返回個數,類型)
初始化完成后,會調用process方法,對傳入的參數進行處理,可以通過forword()方法把結果返回 最后close()方法調用,對需要清理的方法進行清理 使用方法 UDTF有兩種使用方法,一種直接放到select后面,一種和lateral view一起使用 直接select中使用:select explode_map(properties) as (col1,col2) from src; 不可以添加其他字段使用:select a, explode_map(properties) as (col1,col2) from src 不可以嵌套調用:select explode_map(explode_map(properties)) from src 不可以和group by/cluster by/distribute by/sort by一起使用:select explode_map(properties) as (col1,col2) from src group by col1, col2 和lateral view一起使用:select src.id, mytable.col1, mytable.col2 from src lateral view explode_map(properties) mytable as col1, col2; 此方法更為方便日常使用。執行過程相當于單獨執行了兩次抽取,然后union到一個表里。 lateral view Lateral View語法 lateralView:?LATERAL?VIEW?udtf(expression)?tableAlias?AS?columnAlias?(','?columnAlias)*?fromClause:?FROM?baseTable?(lateralView)*?? Lateral View用于UDTF(user-defined table generating functions)中將行轉成列,例如explode(). 目前Lateral View不支持有上而下的優化。如果使用Where子句,查詢可能將不被編譯。解決方法見: 此時,在查詢之前執行set hive.optimize.ppd=false; 例子 pageAds。它有兩個列
| string pageid | Array<int> adid_list |
| " front_page" | [1, 2, 3] |
| "contact_page " | [ 3, 4, 5] |
轉載于:https://blog.51cto.com/4473841/1352195
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的Hive 高级编程??深入浅出学Hive的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 告别2013拥抱2014
- 下一篇: 2014第3周日