本發(fā)明涉及大數(shù)據(jù)處理的技術(shù)領(lǐng)域,尤其涉及一種hive持久化函數(shù)的控制方法,以及hive持久化函數(shù)的控制系統(tǒng)。
背景技術(shù):
hive是基于Hadoop的一個數(shù)據(jù)倉庫工具,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表,并提供簡單的sql查詢功能,可以將sql語句轉(zhuǎn)換為MapReduce任務(wù)進行運行。其優(yōu)點是學習成本低,可以通過類SQL語句快速實現(xiàn)簡單的MapReduce統(tǒng)計,不必開發(fā)專門的MapReduce應(yīng)用,十分適合數(shù)據(jù)倉庫的統(tǒng)計分析。
在hive平臺上做大數(shù)據(jù)計算時通用會使用到UDF(User-Defined Functions,用戶定義函數(shù)),主要是由于UDF非常靈活易用,用戶可以在UDF中實現(xiàn)非常復(fù)雜的邏輯運算,在某些情況下UDF具有不可替代的作用。
在hive中建立持久化UDF的時候需要在每個數(shù)據(jù)庫中執(zhí)行一遍create function UDF名as包命using jar‘集群路徑’的命令,即創(chuàng)建UDF名稱并通過指定已經(jīng)上傳到集群中jar包的某個類完成該UDF的定義。在對UDF進行刪除等操作也是如此。例如,中國專利申請(申請?zhí)枺篊N201410483891.0)提供了一種Hive中自制用戶提取信息工具的方法和裝置。
如果需要加載UDF的數(shù)據(jù)庫很多,則對UDF的添加、刪除等操作將非常費時費力。如果只在一個數(shù)據(jù)庫下建立UDF,在其他數(shù)據(jù)庫中使用該UDF時,則需要在UDF名前添加該UDF所在數(shù)據(jù)庫的名稱,即:數(shù)據(jù)庫名.UDF名。這雖然降低了建立UDF的復(fù)雜性,卻使UDF的使用變得復(fù)雜。
技術(shù)實現(xiàn)要素:
為克服現(xiàn)有技術(shù)的缺陷,本發(fā)明要解決的技術(shù)問題是提供了一種hive持久化函數(shù)的控制方法,其使得在大量數(shù)據(jù)庫需要添加UDF時操作變得方便,增強了可維護性,使得UDF具有更強的易用性,保證了UDF的靈活性和安全性。
本發(fā)明的技術(shù)方案是:這種hive持久化函數(shù)的控制方法,該方法包括以下步驟:
(1)修改hive的源代碼,以便在不指定數(shù)據(jù)庫域名時,使hive的讀取和存儲UDF信息的操作指向default數(shù)據(jù)庫;
(2)優(yōu)化hive的部署;
(3)建立跨庫UDF:在hive中的任意一個數(shù)據(jù)庫下,用create function建立跨庫UDF。
本發(fā)明通過在hive中的任意一個數(shù)據(jù)庫中創(chuàng)建UDF,則可以在hive中所有庫中跨庫訪問該UDF,而不必在每個數(shù)據(jù)庫中都創(chuàng)建一遍UDF。使得在大量數(shù)據(jù)庫需要添加UDF時操作變得方便,增強了可維護性;在hive的各個數(shù)據(jù)庫中使用UDF時,可以像使用hive內(nèi)置的函數(shù)一樣方便,不需要添加任何數(shù)據(jù)庫域名前綴,使得UDF具有更強的易用性;依然可以創(chuàng)建個別數(shù)據(jù)庫自有的UDF,只需添加數(shù)據(jù)庫域名前綴即可,保證了UDF的靈活性和安全性。
還提供了一種hive持久化函數(shù)的控制系統(tǒng),該系統(tǒng)包括:
hive的源代碼修改模塊,其配置來檢查輸入的參數(shù)是否合法;
部署優(yōu)化模塊,其配置來優(yōu)化hive的部署;
跨庫UDF建立模塊,其配置來在hive中的任意一個數(shù)據(jù)庫下,用create function建立跨庫UDF。
附圖說明
圖1所示為根據(jù)本發(fā)明的hive持久化函數(shù)的控制方法的流程圖。
具體實施方式
如圖1所示,這種hive持久化函數(shù)的控制方法,該方法包括以下步驟:
(1)修改hive的源代碼,以便在不指定數(shù)據(jù)庫域名時,使hive的讀取和存儲UDF信息的操作指向default數(shù)據(jù)庫;
(2)優(yōu)化hive的部署;
(3)建立跨庫UDF:在hive中的任意一個數(shù)據(jù)庫下,用create function建立跨庫UDF。
本發(fā)明通過在hive中的任意一個數(shù)據(jù)庫中創(chuàng)建UDF,則可以在hive中所有庫中跨庫訪問該UDF,而不必在每個數(shù)據(jù)庫中都創(chuàng)建一遍UDF。使得在大量數(shù)據(jù)庫需要添加UDF時操作變得方便,增強了可維護性;在hive的各個數(shù)據(jù)庫中使用UDF時,可以像使用hive內(nèi)置的函數(shù)一樣方便,不需要添加任何數(shù)據(jù)庫域名前綴,使得UDF具有更強的易用性;依然可以創(chuàng)建個別數(shù)據(jù)庫自有的UDF,只需添加數(shù)據(jù)庫域名前綴即可,保證了UDF的靈活性和安全性。
另外,所述步驟(1)中,首先修改類FunctionRegistry中g(shù)etFunctionInfoFromMetastore函數(shù)和getFunctionInfo,將其中的dbName=SessionState.get().getCurrentDatabase().toLowerCase()替換為dbName=default;再修改類FunctionUtils類中的getQualifiedFunctionNamePart函數(shù),將其中的String dbName=SessionState.get().getCurrentDatabase()替換為dbName=default。
另外,所述步驟(2)中,將修改好的hive文件中的ql工程用mvn編譯成jar包,在含有pom.xml的項目路徑下執(zhí)行mvn package,生成包含依賴的jar文件,然后用該jar包替換機器上原有的jar包。
另外,所述步驟(3)中,在任意數(shù)據(jù)庫下,創(chuàng)建UDF名稱,并通過指定已經(jīng)上傳到集群中jar包的一個類完成該UDF的定義,從而建立跨庫訪問的UDF。具體地,執(zhí)行create function UDF名as包名.類名,使用jar包在hadoop集群中的路徑。
另外,該方法還包括步驟(4),在創(chuàng)建UDF時,如果添加數(shù)據(jù)庫域名前綴,則UDF建立在該數(shù)據(jù)庫下。
本領(lǐng)域普通技術(shù)人員可以理解,實現(xiàn)上述實施例方法中的全部或部分步驟是可以通過程序來指令相關(guān)的硬件來完成,所述的程序可以存儲于一計算機可讀取存儲介質(zhì)中,該程序在執(zhí)行時,包括上述實施例方法的各步驟,而所述的存儲介質(zhì)可以是:ROM/RAM、磁碟、光盤、存儲卡等。因此,與本發(fā)明的方法相對應(yīng)的,本發(fā)明還同時包括一種hive持久化函數(shù)的控制系統(tǒng),該系統(tǒng)通常以與方法各步驟相對應(yīng)的功能模塊的形式表示。使用該方法的系統(tǒng)包括:
hive的源代碼修改模塊,其配置來檢查輸入的參數(shù)是否合法;
部署優(yōu)化模塊,其配置來優(yōu)化hive的部署;
跨庫UDF建立模塊,其配置來在hive中的任意一個數(shù)據(jù)庫下,用create function建立跨庫UDF。
本發(fā)明的有益效果如下:
1.通過在hive中的任意一個數(shù)據(jù)庫中創(chuàng)建UDF,則可以在hive中所有庫中跨庫訪問該UDF,而不必在每個數(shù)據(jù)庫中都創(chuàng)建一遍UDF。使得在大量數(shù)據(jù)庫需要添加UDF時操作變得方便,增強了可維護性。
2.在hive的各個數(shù)據(jù)庫中使用UDF時,可以像使用hive內(nèi)置的函數(shù)一樣方便,不需要添加任何數(shù)據(jù)庫域名前綴,使得UDF具有更強的易用性。
3.依然可以創(chuàng)建個別數(shù)據(jù)庫自有的UDF,只需添加數(shù)據(jù)庫域名前綴即可,保證了UDF的靈活性和安全性。
以上所述,僅是本發(fā)明的較佳實施例,并非對本發(fā)明作任何形式上的限制,凡是依據(jù)本發(fā)明的技術(shù)實質(zhì)對以上實施例所作的任何簡單修改、等同變化與修飾,均仍屬本發(fā)明技術(shù)方案的保護范圍。