本發(fā)明涉及計(jì)算機(jī)信息技術(shù)領(lǐng)域,具體涉及一種通用的兩個(gè)數(shù)據(jù)庫(kù)聯(lián)合查詢方法。
背景技術(shù):
隨著大規(guī)?;ヂ?lián)網(wǎng)應(yīng)用的普及,網(wǎng)絡(luò)信息數(shù)據(jù)的海量劇增,大數(shù)據(jù)已然對(duì)國(guó)家治理、企業(yè)決策、個(gè)人生活都產(chǎn)生了巨大的影響。在大數(shù)據(jù)的背景時(shí)代下,分布式文件系統(tǒng)、分布式數(shù)據(jù)庫(kù)等都是適用于大數(shù)據(jù)的技術(shù)。如今為滿足人們的查詢需要,實(shí)現(xiàn)多個(gè)數(shù)據(jù)庫(kù)之間聯(lián)合查詢是很有必要的。
目前,對(duì)于兩種數(shù)據(jù)庫(kù)做聯(lián)合查詢主要是Hive與HBase表聯(lián)合查詢,如專利號(hào)為201410000720.8的中國(guó)發(fā)明專利公開了一種HBase表聯(lián)合查詢優(yōu)化的方法。該方法為:首先根據(jù)HBase中表的格式創(chuàng)建相應(yīng)的Hive外部表;Hive外部表創(chuàng)建成功后,在Hive表和HBase表之間建立關(guān)聯(lián)關(guān)系,即Hive表的列和列類型與HBase表的列族及列限定詞建立關(guān)聯(lián),并通過(guò)兩者本身對(duì)外的API接口相互進(jìn)行通信;進(jìn)入查詢步驟,根據(jù)Hive中自帶的HQL語(yǔ)句將Hive中的兩個(gè)表格按照條件聯(lián)合查詢,用底層的MapReduce處理聯(lián)合查詢?nèi)蝿?wù),查詢出滿足條件的記錄;將查詢結(jié)果存放在HBase表中。
上述方法的不足之處在于,這種Hive與HBase表聯(lián)合查詢的方法不通用,其要求兩數(shù)據(jù)庫(kù)在同一個(gè)網(wǎng)段,且基于兩者本身對(duì)外的API接口相互進(jìn)行通信,對(duì)于那些不在同一個(gè)網(wǎng)段,沒有此類接口,或接口使用方式不同的數(shù)據(jù)庫(kù),不能復(fù)用該方法。
技術(shù)實(shí)現(xiàn)要素:
為克服上述不足,本發(fā)明提供一種通用的兩個(gè)數(shù)據(jù)庫(kù)聯(lián)合查詢方法,具有通用性,尤其是兩數(shù)據(jù)庫(kù)網(wǎng)不通的情況,通過(guò)把查詢結(jié)果在其中一個(gè)數(shù)據(jù)庫(kù)中建表,給用戶拿到想要的數(shù)據(jù)結(jié)果。
為解決上述技術(shù)問(wèn)題,本發(fā)明采用如下技術(shù)方案:
一種通用的兩個(gè)數(shù)據(jù)庫(kù)(A,B)聯(lián)合查詢方法,步驟包括:
1)從A庫(kù)的對(duì)應(yīng)表中讀出數(shù)據(jù)生成數(shù)據(jù)文件,基于該數(shù)據(jù)文件生成SQL文件,并發(fā)送到B庫(kù)節(jié)點(diǎn);
2)通過(guò)B庫(kù)提供的接口建立臨時(shí)表,并把上述數(shù)據(jù)文件導(dǎo)入該表中,替換SQL中的表名;
3)在B庫(kù)中執(zhí)行替換好的SQL,把結(jié)果生成數(shù)據(jù)文件,并發(fā)回A庫(kù)節(jié)點(diǎn);
4)在A庫(kù)中建立臨時(shí)表,把步驟3)的數(shù)據(jù)文件導(dǎo)入該表中,并把庫(kù)名和表名返回給用戶。
進(jìn)一步地,所述數(shù)據(jù)文件為標(biāo)準(zhǔn)CSV格式文件。
進(jìn)一步地,通過(guò)HCatalog從A庫(kù)的對(duì)應(yīng)表中讀出數(shù)據(jù)。
進(jìn)一步地,通過(guò)隔離機(jī)實(shí)現(xiàn)A庫(kù)與B庫(kù)之間的數(shù)據(jù)傳送。
進(jìn)一步地,如果B庫(kù)有多個(gè)臨時(shí)表要建立,可通過(guò)重復(fù)執(zhí)行步驟2),待全部臨時(shí)表建立完畢后再執(zhí)行步驟3)。
進(jìn)一步地,所述SQL文件內(nèi)容包括用戶填入的SQL、數(shù)據(jù)文件的切分規(guī)則、數(shù)據(jù)文件的表格式、數(shù)據(jù)文件和SQL中表的對(duì)應(yīng)關(guān)系。
進(jìn)一步地,在B庫(kù)通過(guò)SQL文件中數(shù)據(jù)文件的表格式建立臨時(shí)表。
進(jìn)一步地,將步驟3)中所述數(shù)據(jù)文件先上傳到HDFS,再將HDFS上的數(shù)據(jù)文件導(dǎo)入到步驟4)中的臨時(shí)表中。
進(jìn)一步地,所述步驟4)中通過(guò)HCatalog以用戶配置的結(jié)果表的表格式建立臨時(shí)表。
進(jìn)一步地,每生成一個(gè)數(shù)據(jù)文件,都會(huì)生成對(duì)應(yīng)的.ok文件。
本發(fā)明的有益效果是,本發(fā)明提供的這種兩個(gè)數(shù)據(jù)庫(kù)之間的聯(lián)合查詢方法具有通用性,不受限于不同的網(wǎng)段和接口,通過(guò)把查詢結(jié)果在其中一個(gè)數(shù)據(jù)庫(kù)中建表,給用戶拿到想要的數(shù)據(jù)結(jié)果。其中,通過(guò)隔離機(jī)傳輸數(shù)據(jù)文件,保證了兩個(gè)數(shù)據(jù)庫(kù)之間的獨(dú)立性;使用標(biāo)準(zhǔn)CSV格式的文件,保證了讀出和寫入數(shù)據(jù)的格式一致性;通過(guò)建立臨時(shí)表,替換SQL來(lái)進(jìn)行查詢,利用了B庫(kù)的高可用性。
附圖說(shuō)明
圖1為實(shí)施例中一種通用的兩個(gè)數(shù)據(jù)庫(kù)聯(lián)合查詢方法的流程圖。
具體實(shí)施方式
為使本發(fā)明的上述特征和優(yōu)點(diǎn)能更明顯易懂,下文特舉實(shí)施例,并配合所附圖作詳細(xì)說(shuō)明如下。
本實(shí)施例提供一種通用的兩個(gè)數(shù)據(jù)庫(kù)聯(lián)合查詢方法,這兩個(gè)數(shù)據(jù)庫(kù)分別為Hive、神舟通用數(shù)據(jù)庫(kù),如圖1所示,具體流程如下:
以Hive中student表與神舟通用數(shù)據(jù)庫(kù)中student_info表做聯(lián)合查詢?yōu)槔?。student表中有兩列,分別為h_s_name,h_s_id;student_info表中有三列,分別為st_s_id,st_s_mentor,st_s_gpa。
用戶從頁(yè)面上輸入SQL:select a.h_s_name,b.st_s_mentor,b.st_s_gpa form student a,student_info b where a.h_s_id=b.st_s_id。
程序根據(jù)傳入的Hive表名,此例中即為student,通過(guò)HCatalog讀出數(shù)據(jù),生成一個(gè)數(shù)據(jù)文件。文件命名分為三部分:第一部分為“DATA_”;第二部分為由Java UUID生成的32位字符串;第三部分為“_inportX”,X替換文件編號(hào),程序支持一個(gè)或多個(gè)Hive表做聯(lián)合查詢。
程序生成SQL文件,此文件中包含用戶填入的SQL、數(shù)據(jù)文件的切分規(guī)則、數(shù)據(jù)文件的表格式、數(shù)據(jù)文件和SQL中表的對(duì)應(yīng)關(guān)系。SQL文件的命名分為兩部分:第一部分“SQL_”;第二部分第二步生成的UUID,以此保證數(shù)據(jù)文件和SQL文件的關(guān)聯(lián)關(guān)系。
上述兩文件的生成目錄為隔離機(jī)監(jiān)視目錄(如:A_to_B)。文件生成結(jié)束后,生成對(duì)應(yīng)文件的.ok文件。隔離機(jī)通過(guò)輪詢?cè)撃夸?,?dāng)該目錄下有文件,并有對(duì)應(yīng)的.ok文件(如:文件test.txt和test.txt.ok),則把這兩個(gè)文件發(fā)送到對(duì)端的同名目錄下。
在對(duì)端的同名目錄(A_to_B)下,由監(jiān)視程序一直輪詢?cè)撃夸?。?dāng)收到數(shù)據(jù)文件和SQL文件,并且文件的數(shù)量正確,則開始連接神舟通用數(shù)據(jù)庫(kù)。
建立連接成功后,通過(guò)SQL文件中數(shù)據(jù)文件的表格式建立臨時(shí)表,并把對(duì)應(yīng)的數(shù)據(jù)導(dǎo)入臨時(shí)表中,替換SQL中的對(duì)應(yīng)表名為臨時(shí)表名。若有多個(gè)表則重復(fù)該步,全部臨時(shí)表建立完畢后,執(zhí)行替換過(guò)表名的SQL語(yǔ)句。
把查詢的結(jié)果生成數(shù)據(jù)文件,五十萬(wàn)條數(shù)據(jù)寫一個(gè)文件,命名分為三部分:第一部分“Result_”,第二部分為第二步生成的UUID,第三部分為“partX”,X替換文件編號(hào)。文件的生成目錄(如:B_to_A)由隔離機(jī)監(jiān)控。每生成一個(gè)數(shù)據(jù)文件,都會(huì)生成對(duì)應(yīng)的.ok文件。查詢結(jié)束后,會(huì)生成一個(gè)以“partNums”結(jié)尾的數(shù)據(jù)文件,該數(shù)據(jù)文件中保存此次查詢的結(jié)果文件數(shù)量。關(guān)閉與神舟通用數(shù)據(jù)庫(kù)的連接。
程序會(huì)一直輪詢本端的同名目錄(B_to_A),當(dāng)接收到以“partNums”結(jié)尾的數(shù)據(jù)文件后,通過(guò)解析,拿到數(shù)據(jù)文件數(shù)量,確定查詢是否已經(jīng)結(jié)束并把對(duì)應(yīng)的數(shù)據(jù)文件上傳到HDFS。
通過(guò)HCatalog,以用戶配置的結(jié)果表的表格式建表,并把HDFS上的數(shù)據(jù)文件導(dǎo)入結(jié)果表中,返回庫(kù)名和表名。
由上述實(shí)施例可知,本發(fā)明提供的這種兩個(gè)數(shù)據(jù)庫(kù)之間的聯(lián)合查詢方法具有通用性,不受限于不同的網(wǎng)段和接口,通過(guò)把查詢結(jié)果在其中一個(gè)數(shù)據(jù)庫(kù)中建表,給用戶拿到想要的數(shù)據(jù)結(jié)果。其中,通過(guò)隔離機(jī)傳輸數(shù)據(jù)文件,保證了兩個(gè)數(shù)據(jù)庫(kù)之間的獨(dú)立性;使用標(biāo)準(zhǔn)CSV格式的文件,保證了讀出和寫入數(shù)據(jù)的格式一致性;通過(guò)建立臨時(shí)表,替換SQL來(lái)進(jìn)行查詢,利用了B庫(kù)的高可用性。