從頭學習大數據培訓課程 數據倉儲工具 hive(六)在 eclipse 上運行 hive、自定義 UDF 和 UDAF
1. 在eclipse上運行hive
通過sh -x /usr/local/hive/bin/hive查看執行了那個類
發現是執行的hive的cli,在阿里雲上搜索hive-cli
新建maven項目,並添加hive-cli的pom
如果項目報錯有可能是缺少一個maven插件,是因為ali的maven庫里沒有這個插件所以需要手動下載,並放到自己的maven庫里
放到自己maven庫中的這個目錄下面maven_repositoriesorgpentahopentaho-aggdesigner-algorithm5.1.5-jhyde找到org.apache.hadoop.hive.cli.CliDriver類的main方法
導出虛擬機上的mysql庫的元數據
也可以使用hive-metastore的sql腳本進行導入
在本機的mysql上安裝hive元庫,在navicat中按F6調出mysql控制台
導入剛才在虛擬機上導出的hive元數據
導入完成
刷新一個資料庫查看錶是否導出完成
在pom裡面加上mysql連接驅動
在虛擬機上獲得這兩個配置
複製在項目的resource目錄
修改hive-site.xml,讓你的eclipse中的hive連接自己windows上的資料庫
然後運行CliDriver的main方法,啟動eclipse上的hive
發現輸入的命令不好使,是因為hive使用的是jline接受輸入命令
自己寫一個類把clidriver中的main方法拷貝到自己類中的main方法中並加上讓jline使用http://system.in做控制台的輸入
System.setProperty("jline.WindowsTerminal.directConsole", "false");然後運行自己類中的main方法在eclipse上啟動hive
由於修改了jline的系統屬性,所以在自己的類中運行的hive是能接受輸入信息的
首先創建一個表測試一下eclipse上的hive是否能正常運行
CREATE EXTERNAL TABLE user_install_status(aid string COMMENT from deserializer,
pkgname string COMMENT from deserializer,uptime bigint COMMENT from deserializer,type int COMMENT from deserializer,country string COMMENT from deserializer,gpcategory string COMMENT from deserializer)PARTITIONED BY (dt string)stored as orcLOCATION /Users/Leo.He/Work/hadoop/data/user/face/warehouse/user/user_install_status_orcTBLPROPERTIES (orc.compress=SNAPPY,orc.create.index=true);修改locastion為你本地硬碟上的地址
show tables 看建表是否成功
alter table user_install_status add partition (dt=20141228) location 20141228;
select * from user_install_status limit 10;說明ORC文件也能正常讀出,從而說明eclipse上可以運行一個完正的hive測試一下group by,select country,count(1) from user_install_status group by country;
2. 函數
UDF、UDAF、UDTF區別
UDF對單行記錄進行處理
UDAF多行記錄匯總成一行,常用於聚合函數UDTF單行記錄轉換成多行記錄新建function包,所有的自定義函數寫在這個包的下面
1).UDF
需求,能將國家編碼轉成中文國家名的UDF函數1.繼承 UDF,實現evaluate,傳參類型和返回值類型代碼中體現首先上傳code對應名稱的數據放到resource目錄下
(1).創建自定義UDF類並繼承hive的UDF類
首先把數據讀到緩存里,然後實現evaluate方法,evaluate是實現自定UDF主要邏輯的地方
hive載入自定義函數的方法
CREATE TEMPORARY FUNCTION [function_name ] AS class_path;CREATE TEMPORARY FUNCTION hainiu_code_country AS com.hainiu.hive.function.UDFHainiuCountry2name;select country,hainiu_code_country(country) from user_install_status limit 10;測試結果
(2).繼承 GenericUDF
public void configure(MapredContext context) {}//可選,該方法中可以通過context.getJobConf()獲取job執行時候的Configuration;//可以通過Configuration傳遞參數值public ObjectInspector initialize(ObjectInspector[] arguments)//必選,該方法用於函數初始化操作,並定義函數的返回值類型,判斷傳入參數的類型;//比如,在該方法中可以初始化對象實例,初始化資料庫鏈接,初始化讀取文件等;public Object evaluate(DeferredObject[] args){}//必選,函數處理的核心方法,用途和UDF中的evaluate一樣;public String getDisplayString(String[] children)//必選,顯示函數的幫助信息public void close(){}//可選,map完成後,執行關閉操作創建類繼承GenericUDF
實現那3個必要的方法
CREATE TEMPORARY FUNCTION hainiu_code_country_gen AS com.hainiu.hive.function.UDFHainiuCountry2nameGen;
select country,hainiu_code_country_gen(country) from user_install_status limit 10;使用initialize檢查輸入參數運行結果和上一個udf相同
2).UDAF
自定義UDAF需要繼承AbstractGenericUDAFResolver實現UDAFEvaluator需要繼承GenericUDAFEvaluatorinit定義函數的返回值類型
map 這個是mapreduce的map階段:從原始數據到部分數據聚合iterate()和terminatePartial()combiner 負責在map端合併map的數據::從部分數據聚合到部分數據聚合:merge() 和 terminatePartial()reduce mapreduce的reduce階段:從部分數據的聚合到完全聚合merge()和terminate()map only 如果出現了這個階段,表示mapreduce只有map,沒有reduce,所以map端就直接出結果了:從原始數據直接到完全聚合iterate()和terminate()各階段含義
需求:實現sum函數
實現自己的UDAF函數實現自定義的udafEvaluator
以下為4個主要的方法
在eclipse的hive控制台中,註冊臨時函數用局部數據做測試,從列印信息中可以看到map階段調用了iterate和terminatePartial,reduce階段調用了merge和terminate
CREATE TEMPORARY FUNCTION hainiu_sum AS com.hainiu.hive.function.UDAFHainiuSum;select hainiu_sum(uptime) from(select uptime from user_install_status limit 10) a;3. 集群運行模式
首先給項目打成jar包
add jar [local_jar_path];
首先進入hive控制台,然後使用add jar把剛才打的jar包添加進去add jar /home/qingniu/hive_function/hive-1.0-hainiu.jar;CREATE TEMPORARY FUNCTION hainiu_sum AS com.hainiu.hive.function.UDAFHainiuSum;select hainiu_sum(uptime) from(select uptime from user_install_status limit 10) a;在集群上查看列印日誌的方法
在集群上同時測試自己定義的UDF和UDAF。
先上傳jar包,然後在hive控制台執行下面語句add jar /home/qingniu/hive_function/hive-1.0-hainiu.jar;CREATE TEMPORARY FUNCTION hainiu_code_country_gen AS com.hainiu.hive.function.UDFHainiuCountry2nameGen;CREATE TEMPORARY FUNCTION hainiu_sum AS com.hainiu.hive.function.UDAFHainiuSum;select hainiu_code_country_gen(country),hainiu_sum(uptime) from user_install_status group by country;推薦閱讀:
※大數據時代來了,你準備好了嗎?
※又到求職黃金季,這些技能助你一臂之力【阿里直聘優先錄取】
※大數據雙創行動丨校園裡誕生的大數據創客
※大數據學習筆記:Hadoop之HDFS(下)
※中華財寶:珠寶行業在大數據時代該如何前行?