一種基于hive的歷史數(shù)據(jù)存檔與查詢方法
【專利摘要】本發(fā)明提出一種基于hive的歷史數(shù)據(jù)存檔與查詢方法,首先建立hive表,然后使用ETL工具導(dǎo)出源數(shù)據(jù)并驗(yàn)證,通過(guò)驗(yàn)證后將源數(shù)據(jù)導(dǎo)入hive表,以及基于Thrift接口從hive表中查詢歷史數(shù)據(jù)。本發(fā)明提出的所述方法能夠向其它軟件提供接口,并完成定制化歷史數(shù)據(jù)導(dǎo)入和數(shù)據(jù)查詢的功能。
【專利說(shuō)明】-種基于hive的歷史數(shù)據(jù)存檔與查詢方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及計(jì)算機(jī)存儲(chǔ)【技術(shù)領(lǐng)域】,具體涉一種基于hive的歷史數(shù)據(jù)存檔與查詢 方法。
【背景技術(shù)】
[0002] 大數(shù)據(jù)(big data),或稱巨量資料,指的是所涉及的資料規(guī)模巨大到無(wú)法透過(guò)目 前主流軟件工具,在合理時(shí)間內(nèi)達(dá)到擷取、管理、處理、并整理成為幫助企業(yè)經(jīng)營(yíng)決策更積 極目的的資訊。近年大數(shù)據(jù)技術(shù)在互聯(lián)網(wǎng)上的應(yīng)用逐漸成熟,在不知不覺(jué)中已開(kāi)始改變我 們的生活。同時(shí)大數(shù)據(jù)技術(shù)的應(yīng)用范圍也開(kāi)始向其它行業(yè)擴(kuò)充,當(dāng)然這也帶來(lái)新的技術(shù)問(wèn) 題。
[0003] Hadoop Distributed File System(HDFS)被設(shè)計(jì)成適合運(yùn)行在通用硬件 (commodity hardware)上的分布式文件系統(tǒng)。HDFS是一個(gè)高度容錯(cuò)性的系統(tǒng),適合部署在 廉價(jià)的機(jī)器上。HDFS能提供高吞吐量的數(shù)據(jù)訪問(wèn),非常適合大規(guī)模數(shù)據(jù)集上的應(yīng)用。
[0004] thrift是一個(gè)軟件框架,用來(lái)進(jìn)行可擴(kuò)展且跨語(yǔ)言的服務(wù)的開(kāi)發(fā)。它結(jié)合了功能 強(qiáng)大的軟件堆棧和代碼生成引擎,以構(gòu)建在C++, Java, Python, PHP, Ruby, Erlang, Perl, Has kell, C#, Cocoa, JavaScript, Node, js, Smalltalk, and OCaml 這些編程語(yǔ)言間無(wú)縫結(jié)合的、 1?效的服務(wù)。
[0005] hive是基于Hadoop的一個(gè)數(shù)據(jù)倉(cāng)庫(kù)工具,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張 數(shù)據(jù)庫(kù)表,并提供簡(jiǎn)單的sql查詢功能,可以將sql語(yǔ)句轉(zhuǎn)換為MapReduce任務(wù)進(jìn)行運(yùn)行。 其優(yōu)點(diǎn)是學(xué)習(xí)成本低,可以通過(guò)類SQL語(yǔ)句快速實(shí)現(xiàn)簡(jiǎn)單的MapReduce統(tǒng)計(jì),不必開(kāi)發(fā)專門(mén) 的MapReduce應(yīng)用,十分適合數(shù)據(jù)倉(cāng)庫(kù)的統(tǒng)計(jì)分析。并且它仍然利用HDFS文件系統(tǒng)作為底 層文件存儲(chǔ)系統(tǒng),這就保證了存儲(chǔ)系統(tǒng)的穩(wěn)定性和易擴(kuò)展性。
[0006] 隨著金融、電信、能源等傳統(tǒng)產(chǎn)業(yè)在運(yùn)營(yíng)、管理過(guò)程中產(chǎn)生的數(shù)據(jù)量逐年增多,這 些數(shù)據(jù)的大小超出了典型數(shù)據(jù)庫(kù)軟件工具收集、存儲(chǔ)、管理和分析的能力,大數(shù)據(jù)技術(shù)在傳 統(tǒng)產(chǎn)業(yè)中的應(yīng)用也提到了日程。特別是金融行業(yè)亟需一種高效、安全的方法存儲(chǔ)他們?nèi)找?增加的交易和管理數(shù)據(jù)。
【發(fā)明內(nèi)容】
[0007] 為了解決上述技術(shù)問(wèn)題,本發(fā)明提出一種基于hive的歷史數(shù)據(jù)存檔與查詢方法, 包括:
[0008] 1)建立hive表,并在hive表中建立分區(qū);
[0009] 2)使用ETL工具從其它數(shù)據(jù)庫(kù)中導(dǎo)出源數(shù)據(jù),將源數(shù)據(jù)作為文件中的記錄保存在 文件中,即從其他數(shù)據(jù)庫(kù)中導(dǎo)出的一條源數(shù)據(jù)對(duì)應(yīng)于文件中的一條記錄;
[0010] 3)對(duì)文件中的記錄進(jìn)行驗(yàn)證;
[0011] 4)通過(guò)驗(yàn)證后,將文件中的記錄導(dǎo)入臨時(shí)表,再將臨時(shí)表中的數(shù)據(jù)插入有分區(qū)結(jié) 構(gòu)的hive表;
[0012] 5)基于Thrift接口從hive表中查詢歷史數(shù)據(jù)。
[0013] 特別地,所述步驟2)還包括:文件中的記錄的每列采用' | + | '進(jìn)行分隔,記錄的每 行之間采用' I-I '標(biāo)記結(jié)尾,并跟上回車符;上述' I + I '稱為分隔符,' I-I '稱為分行符。
[0014] 特別地,所述步驟3)中所述驗(yàn)證過(guò)程具體為:根據(jù)步驟1)中建立的hive表的列 數(shù)信息統(tǒng)計(jì)文件中記錄的列數(shù)信息是否正確,并且驗(yàn)證所述分隔符和分行符是否無(wú)誤。
[0015] 特別地,所述步驟4)中所述將臨時(shí)表中的數(shù)據(jù)插入有分區(qū)結(jié)構(gòu)的hive表之前還 包括去除所述分行符的步驟。
[0016] 特別地,所述步驟4)中所述將臨時(shí)表中的數(shù)據(jù)插入有分區(qū)結(jié)構(gòu)的hive表包括:使 用java調(diào)用shell腳本,在腳本中采用add jar語(yǔ)句將更改后的hive jar包導(dǎo)入hive中。
[0017] 特別地,所述步驟5)中基于Thrift接口執(zhí)行歷史數(shù)據(jù)查詢,具體為:客戶端將查 詢請(qǐng)求翻譯成thrift格式的命令,通過(guò)hive server2連接方式將所述thrift格式的命令 發(fā)送到服務(wù)器,所述服務(wù)器將所述thrift格式的命令翻譯成服務(wù)器可以識(shí)別的命令格式 并執(zhí)行,返回查詢數(shù)據(jù)。
[0018] 本發(fā)明提出的方法,能夠向其它軟件提供接口,并完成定制化歷史數(shù)據(jù)導(dǎo)入和數(shù) 據(jù)查詢的功能。
【專利附圖】
【附圖說(shuō)明】
[0019] 圖1為本發(fā)明提出的一種基于hive的歷史數(shù)據(jù)存檔與查詢方法流程圖。
[0020] 圖2為本發(fā)明提出的hive server2運(yùn)行原理示意圖。
【具體實(shí)施方式】
[0021] 下面參照附圖1,描述實(shí)現(xiàn)本發(fā)明一個(gè)實(shí)施例提出的方法,步驟如下:
[0022] (一)數(shù)據(jù)導(dǎo)入存儲(chǔ)方法
[0023] 包含如下三個(gè)步驟:(1)建立hive表;(2)檢驗(yàn)ETL導(dǎo)出數(shù)據(jù)的正確性;(3)數(shù)據(jù) 導(dǎo)入。本技術(shù)大部分的功能使用腳本語(yǔ)言實(shí)現(xiàn),整體代碼有著方便、簡(jiǎn)潔的特點(diǎn)。
[0024] 1)建立 hive 表
[0025] 為了使代碼更加簡(jiǎn)便,并且有很好的交互性,在本發(fā)明中建表和數(shù)據(jù)導(dǎo)入使用 java調(diào)用腳本的方式完成,用戶可以使用java接口調(diào)用相應(yīng)的腳本來(lái)定制構(gòu)建表結(jié)構(gòu)。這 種建表方式使得開(kāi)發(fā)人員在hive之上完成功能開(kāi)發(fā),而不需要對(duì)hive有很深的專業(yè)知識(shí)。
[0026] 2)使用ETL導(dǎo)出數(shù)據(jù)并檢查正確性
[0027] 使用ETL工具從其它數(shù)據(jù)庫(kù)中導(dǎo)出源數(shù)據(jù),將源數(shù)據(jù)作為文件中的記錄保存在文 件中,即從其他數(shù)據(jù)庫(kù)中導(dǎo)出的一條源數(shù)據(jù)對(duì)應(yīng)于文件中的一條記錄,導(dǎo)出文件名為表名 加日期的格式,而文件中的記錄采用變長(zhǎng)記錄格式,即記錄的每列采用'1 + 1'進(jìn)行分隔,而 每行之間采用' I -1 '標(biāo)記結(jié)尾,并跟上回車符;上述' I +1 '稱為分隔符,' I -1 '稱為分行符。
[0028] 在此步驟中需要對(duì)文件中的記錄進(jìn)行驗(yàn)證,所述驗(yàn)證過(guò)程為:首先根據(jù)上一步的 建立hive表的列數(shù)信息統(tǒng)計(jì)文件中列數(shù)是否正確,并且驗(yàn)證分隔符和分行符是否無(wú)誤。
[0029] 3)數(shù)據(jù)導(dǎo)入
[0030] 由于hive不支持多字節(jié)的分行符,所以在將文件中的記錄數(shù)據(jù)導(dǎo)入hive表前,需 將文件中的分行符去除,這一功能是由java完成。
[0031] 金融數(shù)據(jù)中存儲(chǔ)著大量特殊符號(hào),所以該類數(shù)據(jù)的分隔符最好選用復(fù)雜的多分隔 符以便和金融數(shù)據(jù)中的特殊字符區(qū)分,但是hive thrift并不支持多分隔符的數(shù)據(jù)導(dǎo)入,代 碼中使用java調(diào)用shell腳本的方式解決該問(wèn)題,java首先調(diào)用shell腳本,在腳本中采 用add jar語(yǔ)句將更改后的hive jar包導(dǎo)入hive中,使得hive thrift支持多分隔符的 數(shù)據(jù)導(dǎo)入。
[0032] 歷史數(shù)據(jù)的查詢中最重要的是圍繞日期的查詢,所以本發(fā)明公開(kāi)的實(shí)施例提出的 方法采用了分區(qū)的格式以提高基于日期的查詢速度。向分區(qū)表中導(dǎo)入數(shù)據(jù)需要首先創(chuàng)建臨 時(shí)表,并將數(shù)據(jù)導(dǎo)入臨時(shí)表中;然后通過(guò)insert語(yǔ)句將臨時(shí)表中的數(shù)據(jù)插入第1)步中建立 的hive表。
[0033] (二)數(shù)據(jù)查詢方法
[0034] 針對(duì)hive jdbc接口數(shù)據(jù)傳輸較慢的缺點(diǎn),本發(fā)明實(shí)施例提出的數(shù)據(jù)查詢方法使 用了 Thrift接口,但是與thrift對(duì)應(yīng)的hive服務(wù)器(hive sever)極其不穩(wěn)定,經(jīng)常會(huì) 莫名奇妙假死,導(dǎo)致客戶端(client)所有的連接都被阻塞(block)。為解決這一技術(shù)問(wèn) 題,本發(fā)明公開(kāi)的實(shí)施例提出使用hive server2連接方式,所述hive server2連接方式 是大數(shù)據(jù)平臺(tái)工具h(yuǎn)ive開(kāi)啟的服務(wù),該服務(wù)負(fù)責(zé)響應(yīng)符合thrift框架的查詢請(qǐng)求,圖2是 hive server2運(yùn)行原理,客戶端將查詢請(qǐng)求翻譯成thrift格式的命令,服務(wù)器端將thrift 格式的命令翻譯為服務(wù)器可以識(shí)別的命令格式,并運(yùn)行該命令,返回查詢數(shù)據(jù)。使用hive server2連接方式能夠達(dá)到更好的連接穩(wěn)定性。
[0035] 以上所述僅為本申請(qǐng)的優(yōu)選實(shí)施例而已,并不用于限制本申請(qǐng),對(duì)于本領(lǐng)域的技 術(shù)人員來(lái)說(shuō),本申請(qǐng)可以有各種更改和變化。凡在本申請(qǐng)的精神和原則之內(nèi),所作的任何修 改、等同替換、改進(jìn)等,均應(yīng)包含在本申請(qǐng)的保護(hù)范圍之內(nèi)。
【權(quán)利要求】
1. 一種基于hive的歷史數(shù)據(jù)存檔與查詢方法,其特征在于,包括: 1) 建立hive表,并在hive表中建立分區(qū); 2) 使用ETL工具從其它數(shù)據(jù)庫(kù)中導(dǎo)出源數(shù)據(jù),將源數(shù)據(jù)作為文件中的記錄保存在文件 中,即從其他數(shù)據(jù)庫(kù)中導(dǎo)出的一條源數(shù)據(jù)對(duì)應(yīng)于文件中的一條記錄; 3) 對(duì)文件中的記錄進(jìn)行驗(yàn)證; 4) 通過(guò)驗(yàn)證后,將文件中的記錄導(dǎo)入臨時(shí)表,再將臨時(shí)表中的數(shù)據(jù)插入有分區(qū)結(jié)構(gòu)的 hive 表; 5) 基于Thrift接口從hive表中查詢歷史數(shù)據(jù)。
2. 如權(quán)利要求1所述的方法,其特征在于:所述步驟2)還包括:文件中的記錄的每列 采用' 1 + 1 '進(jìn)行分隔,記錄的每行之間采用' 1-1 '標(biāo)記結(jié)尾,并跟上回車符;上述' 1 + 1 '稱 為分隔符,' '稱為分行符。
3. 如權(quán)利要求2所述的方法,其特征在于:所述步驟3)中所述驗(yàn)證具體為:根據(jù)步驟 1)中建立的hive表的列數(shù)信息統(tǒng)計(jì)文件中記錄的列數(shù)信息是否正確,并且驗(yàn)證所述分隔 符和分行符是否無(wú)誤。
4. 如權(quán)利要求1至3任一項(xiàng)所述的方法,其特征在于:所述步驟4)中所述將臨時(shí)表中 的數(shù)據(jù)插入有分區(qū)結(jié)構(gòu)的hive表之前還包括去除所述分行符的步驟。
5. 如權(quán)利要求4所述的方法,其特征在于:所述步驟4)中所述將臨時(shí)表中的數(shù)據(jù)插入 有分區(qū)結(jié)構(gòu)的hive表包括:使用java調(diào)用shell腳本,在腳本中采用add jar語(yǔ)句將更改 后的hive jar包導(dǎo)入hive中。
6. 如權(quán)利要求1,2, 3或5所述的方法,其特征在于:所述步驟5)具體為:客戶端將查 詢請(qǐng)求翻譯成thrift格式的命令,通過(guò)hive server2連接方式將所述thrift格式的命令 發(fā)送到服務(wù)器,所述服務(wù)器將所述thrift格式的命令翻譯成服務(wù)器可以識(shí)別的命令格式 并執(zhí)行,返回查詢數(shù)據(jù)。
【文檔編號(hào)】G06F17/30GK104102701SQ201410321111
【公開(kāi)日】2014年10月15日 申請(qǐng)日期:2014年7月7日 優(yōu)先權(quán)日:2014年7月7日
【發(fā)明者】盧軍佐, 曹連超, 辛國(guó)茂, 亓開(kāi)元, 趙仁明, 房體盈 申請(qǐng)人:浪潮(北京)電子信息產(chǎn)業(yè)有限公司