實(shí)現(xiàn)數(shù)據(jù)查詢的方法和系統(tǒng)的制作方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及數(shù)據(jù)處理技術(shù),特別是涉及一種實(shí)現(xiàn)數(shù)據(jù)查詢的方法和系統(tǒng)。
【背景技術(shù)】
[0002]隨著數(shù)據(jù)量以及數(shù)據(jù)價(jià)值的不斷增長(zhǎng),傳統(tǒng)的數(shù)據(jù)倉(cāng)庫(kù)技術(shù)在各種方面都遇到了巨大的障礙,無(wú)法滿足大數(shù)據(jù)處理的需求。
[0003]Hive是目前互聯(lián)網(wǎng)企業(yè)中用于構(gòu)建數(shù)據(jù)倉(cāng)庫(kù)、處理海量數(shù)據(jù)最常用的開(kāi)源框架,但是由于在進(jìn)行數(shù)據(jù)存儲(chǔ)是未經(jīng)過(guò)任何優(yōu)化,導(dǎo)致其在很多場(chǎng)景下不能很好的體現(xiàn)其運(yùn)行效率,特別是極大地影響了后期的查詢效率。
【發(fā)明內(nèi)容】
[0004]基于此,有必要提供一種能提高查詢效率的實(shí)現(xiàn)數(shù)據(jù)查詢的方法。
[0005]此外,還有必要提供一種能提高查詢效率的實(shí)現(xiàn)數(shù)據(jù)查詢的系統(tǒng)。
[0006]一種實(shí)現(xiàn)數(shù)據(jù)查詢的方法,包括如下步驟:
[0007]獲取查詢請(qǐng)求;
[0008]定位基于Hive的數(shù)據(jù)文件分區(qū)中所述查詢請(qǐng)求對(duì)應(yīng)的桶以及所述桶中的列;
[0009]讀取所述定位得到的桶中的列所對(duì)應(yīng)的數(shù)據(jù)。
[0010]在其中一個(gè)實(shí)施例中,所述定位基于Hive的數(shù)據(jù)文件分區(qū)中所述查詢請(qǐng)求對(duì)應(yīng)的桶以及所述桶中的列的步驟包括:
[0011]轉(zhuǎn)換所述查詢請(qǐng)求為MapReduce任務(wù);
[0012]獲取元數(shù)據(jù),根據(jù)所述元數(shù)據(jù)得到與所述MapReduce任務(wù)相關(guān)的基于Hive的數(shù)據(jù)文件分區(qū);
[0013]根據(jù)定義的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)對(duì)所述MapReduce任務(wù)中的查詢字段進(jìn)行計(jì)算以得到相應(yīng)的信息摘要值,并通過(guò)所述信息摘要值和預(yù)設(shè)的桶數(shù)量之間的取模得到與所述查詢字段對(duì)應(yīng)的數(shù)據(jù)存儲(chǔ)位置,所述數(shù)據(jù)存儲(chǔ)位置用于指示所述查詢字段對(duì)應(yīng)的桶和所述桶中的列。
[0014]在其中一個(gè)實(shí)施例中,所述讀取所述定位得到的桶中的列所對(duì)應(yīng)的數(shù)據(jù)的步驟包括:
[0015]根據(jù)所述查詢字段對(duì)應(yīng)的桶中的列進(jìn)行數(shù)據(jù)加載,并對(duì)所述加載的數(shù)據(jù)進(jìn)行處理。
[0016]在其中一個(gè)實(shí)施例中,所述定位基于Hive的數(shù)據(jù)文件分區(qū)中所述查詢請(qǐng)求對(duì)應(yīng)的桶以及所述桶中的列的步驟之前,所述方法還包括:
[0017]接收輸入的原始數(shù)據(jù),并將所述原始數(shù)據(jù)存儲(chǔ)為第一數(shù)據(jù)表結(jié)構(gòu);
[0018]對(duì)所述存儲(chǔ)為第一數(shù)據(jù)表結(jié)構(gòu)的原始數(shù)據(jù)進(jìn)行優(yōu)化處理,以將優(yōu)化處理所得到的數(shù)據(jù)存入配置文件所配置的基于Hive的數(shù)據(jù)文件分區(qū)中。
[0019]在其中一個(gè)實(shí)施例中,所述接收輸入的原始數(shù)據(jù),并將所述原始數(shù)據(jù)存儲(chǔ)為第一數(shù)據(jù)表結(jié)構(gòu)的步驟包括:
[0020]通過(guò)配置文件配置將所述原始數(shù)據(jù)存入包含分區(qū)信息的數(shù)據(jù)文件中,其中,被存入所述數(shù)據(jù)文件的原始數(shù)據(jù)以JSON格式存儲(chǔ)。
[0021]在其中一個(gè)實(shí)施例中,所述對(duì)所述加載存儲(chǔ)為第一數(shù)據(jù)表結(jié)構(gòu)的原始數(shù)據(jù)進(jìn)行優(yōu)化處理,以將優(yōu)化處理所得到的數(shù)據(jù)存入配置文件所配置的基于Hive的數(shù)據(jù)文件分區(qū)中的步驟包括:
[0022]逐一提取存儲(chǔ)為第一數(shù)據(jù)表結(jié)構(gòu)的原始數(shù)據(jù)中的每一行JSON格式的數(shù)據(jù);
[0023]通過(guò)包含分區(qū)信息的數(shù)據(jù)文件得到對(duì)所述第一數(shù)據(jù)表結(jié)構(gòu)的原始數(shù)據(jù)進(jìn)行存儲(chǔ)的基于Hive的數(shù)據(jù)文件的分區(qū)位置;
[0024]對(duì)所述提取的原始數(shù)據(jù)進(jìn)行計(jì)算以得到相應(yīng)的信息摘要值,并通過(guò)所述信息摘要值和預(yù)設(shè)的桶數(shù)量的取模得到在數(shù)據(jù)文件的分區(qū)中所述原始數(shù)據(jù)的數(shù)據(jù)存儲(chǔ)位置;
[0025]將所述提取的數(shù)據(jù)進(jìn)行壓縮處理,并在壓縮處理后按照所述數(shù)據(jù)存儲(chǔ)位置進(jìn)行存儲(chǔ)。
[0026]一種實(shí)現(xiàn)數(shù)據(jù)查詢的系統(tǒng),包括:
[0027]請(qǐng)求獲取模塊,用于獲取查詢請(qǐng)求;
[0028]定位模塊,用于定位基于Hive的數(shù)據(jù)文件分區(qū)中所述查詢請(qǐng)求對(duì)應(yīng)的桶以及所述桶中的列;
[0029]讀取模塊,用于讀取所述定位得到的桶中的列所對(duì)應(yīng)的數(shù)據(jù)。
[0030]在其中一個(gè)實(shí)施例中,所述定位模塊包括:
[0031]轉(zhuǎn)換單元,用于轉(zhuǎn)換所述查詢請(qǐng)求為MapReduce任務(wù);
[0032]文件分區(qū)獲取單元,用于獲取元數(shù)據(jù),根據(jù)所述元數(shù)據(jù)得到與所述MapReduce任務(wù)相關(guān)的基于Hive的數(shù)據(jù)文件分區(qū);
[0033]位置獲取單元,用于根據(jù)定義的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)對(duì)所述MapReduce任務(wù)中的查詢字段進(jìn)行計(jì)算以得到相應(yīng)的信息摘要值,并通過(guò)所述信息摘要值和預(yù)設(shè)的桶數(shù)量之間的取模得到與所述查詢字段對(duì)應(yīng)的數(shù)據(jù)存儲(chǔ)位置,所述數(shù)據(jù)存儲(chǔ)位置用于指示所述查詢字段對(duì)應(yīng)的桶和所述桶中的列。
[0034]在其中一個(gè)實(shí)施例中,所述讀取模塊還用于根據(jù)查詢字段對(duì)應(yīng)的桶中的列進(jìn)行數(shù)據(jù)加載,并對(duì)所述加載的數(shù)據(jù)輸出于數(shù)據(jù)進(jìn)行處理。
[0035]在其中一個(gè)實(shí)施例中,所述系統(tǒng)還包括:
[0036]原始數(shù)據(jù)存儲(chǔ)模塊,用于接收輸入的原始數(shù)據(jù),并將所述原始數(shù)據(jù)存儲(chǔ)為第一數(shù)據(jù)表結(jié)構(gòu);
[0037]優(yōu)化處理模塊,用于對(duì)所述存儲(chǔ)為第一數(shù)據(jù)表結(jié)構(gòu)的原始數(shù)據(jù)進(jìn)行優(yōu)化處理,以將優(yōu)化處理所得到的數(shù)據(jù)存入配置文件所配置的基于Hive的數(shù)據(jù)文件分區(qū)中。
[0038]在其中一個(gè)實(shí)施例中,所述原始數(shù)據(jù)存儲(chǔ)模塊還用于通過(guò)配置文件配置將所述原始數(shù)據(jù)存入包含分區(qū)信息的數(shù)據(jù)文件中,其中,被存入所述數(shù)據(jù)文件的原始數(shù)據(jù)以JSON格式存儲(chǔ)。
[0039]在其中一個(gè)實(shí)施例中,所述優(yōu)化處理模塊包括:
[0040]提取單元,用于逐一提取存儲(chǔ)為第一數(shù)據(jù)表結(jié)構(gòu)的原始數(shù)據(jù)中的每一行JSON格式的數(shù)據(jù);
[0041]分區(qū)獲取單元,用于通過(guò)包含分區(qū)信息的數(shù)據(jù)文件得到對(duì)所述第一數(shù)據(jù)表結(jié)構(gòu)的原始數(shù)據(jù)進(jìn)行存儲(chǔ)的基于Hive的數(shù)據(jù)文件的分區(qū)位置;
[0042]位置運(yùn)算單元,用于對(duì)所述提取的原始數(shù)據(jù)進(jìn)行計(jì)算以得到相應(yīng)的信息摘要值,并通過(guò)所述信息摘要值和預(yù)設(shè)的桶數(shù)量的取模得到在數(shù)據(jù)文件的分區(qū)中所述原始數(shù)據(jù)的數(shù)據(jù)存儲(chǔ)位置;
[0043]存儲(chǔ)單元,用于將所述提取的數(shù)據(jù)相關(guān)的原始數(shù)據(jù)進(jìn)行壓縮處理,并在壓縮處理后按照所述數(shù)據(jù)存儲(chǔ)位置進(jìn)行存儲(chǔ)。
[0044]上述實(shí)現(xiàn)數(shù)據(jù)查詢的方法和系統(tǒng),在獲取到數(shù)據(jù)的查詢請(qǐng)求之后,將定位基于Hive的數(shù)據(jù)文件分區(qū)中查詢請(qǐng)求所對(duì)應(yīng)的桶以及所述桶中的列,進(jìn)而輸出該列所對(duì)應(yīng)的數(shù)據(jù),由于不需要在所有的數(shù)據(jù)中進(jìn)行查找,而在查找到查詢請(qǐng)求所對(duì)應(yīng)的桶以及列之后所得到的數(shù)據(jù)即為當(dāng)前所需要查詢的數(shù)據(jù),大大提高了查詢效率和查詢速度,即便對(duì)存儲(chǔ)的海量數(shù)據(jù)進(jìn)行查詢也能夠完成數(shù)據(jù)的快速查找。
【附圖說(shuō)明】
[0045]圖1為一個(gè)實(shí)施例中實(shí)現(xiàn)數(shù)據(jù)查詢的方法流程圖;
[0046]圖2為圖1中定位基于Hive的數(shù)據(jù)文件分區(qū)中查詢請(qǐng)求對(duì)應(yīng)的桶以及該桶中的列的方法流程圖;
[0047]圖3為另一個(gè)實(shí)施例中實(shí)現(xiàn)數(shù)據(jù)查詢的方法流程圖;
[0048]圖4為圖3中對(duì)存儲(chǔ)為第一數(shù)據(jù)表結(jié)構(gòu)的原始數(shù)據(jù)進(jìn)行優(yōu)化處理,以將優(yōu)化處理所得到的數(shù)據(jù)存入配置文件所配置的基于Hive的數(shù)據(jù)文件分區(qū)中的方法流程圖;
[0049]圖5為一個(gè)實(shí)施例中實(shí)現(xiàn)數(shù)據(jù)查詢的系統(tǒng)的結(jié)構(gòu)示意圖;
[0050]圖6為圖5中定位模塊的結(jié)構(gòu)示意圖;
[0051]圖7為另一個(gè)實(shí)施例中實(shí)現(xiàn)數(shù)據(jù)查詢的系統(tǒng)的結(jié)構(gòu)示意圖;
[0052]圖8為圖7中優(yōu)化處理模塊的結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
[0053]為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合附圖及實(shí)施例,對(duì)本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說(shuō)明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
[0054]除非上下文另有特定清楚的描述,本發(fā)明中的元件和組件,數(shù)量既可以單個(gè)的形式存在,也可以多個(gè)的形式存在,本發(fā)明并不對(duì)此進(jìn)行限定。本發(fā)明中的步驟雖然用標(biāo)號(hào)進(jìn)行了排列,但并不用于限定步驟的先后次序,除非明確說(shuō)明了步驟的次序或者某步驟的執(zhí)行需要其他步驟作為基礎(chǔ),否則步驟的相對(duì)次序是可以調(diào)整的??梢岳斫猓疚闹兴褂玫男g(shù)語(yǔ)“和/或”涉及且涵蓋相關(guān)聯(lián)的所列項(xiàng)目中的一者或一者以上的任何和所有可能的組入口 ο
[0055]如圖1所示,在一個(gè)實(shí)施例中,一種實(shí)現(xiàn)數(shù)據(jù)查詢的方法,包括如下步驟:
[0056]步驟SI 10,獲取查詢請(qǐng)求。
[0057]本實(shí)施例中,將提供可視化接口,以獲取用戶所觸發(fā)的查詢請(qǐng)求,例如,用戶可通過(guò)以JDBC/0DBC標(biāo)準(zhǔn)的java數(shù)據(jù)庫(kù)控件和網(wǎng)頁(yè)界面等形式存在的數(shù)據(jù)的查詢界面輸入查詢請(qǐng)求,其中,查詢請(qǐng)求可包括用戶指定進(jìn)行查詢的數(shù)據(jù)文件所對(duì)應(yīng)的文件名稱、優(yōu)先等級(jí)、查詢字段、導(dǎo)出文件路徑等信息。
[0058]在優(yōu)選的實(shí)施例中,所獲取的查詢請(qǐng)求將為一個(gè)或者多個(gè),因此,將獲取的查詢請(qǐng)求保存至數(shù)據(jù)庫(kù)表,例如mysql表中,以作為若干個(gè)可執(zhí)行的任務(wù)有序執(zhí)行。
[0059]具體的,將通過(guò)設(shè)置定時(shí)器實(shí)現(xiàn)任務(wù)的調(diào)度。通過(guò)設(shè)置的定時(shí)器觸發(fā)計(jì)時(shí),以自動(dòng)循環(huán)監(jiān)控?cái)?shù)據(jù)庫(kù)表中保存的未執(zhí)行的任務(wù),判斷是否存在未執(zhí)行的任務(wù),若為是,則按照優(yōu)先等級(jí)的高低順序依次執(zhí)行數(shù)據(jù)庫(kù)表中尚未執(zhí)行的任務(wù),并在執(zhí)行成功后將該任務(wù)的狀態(tài)更新為已執(zhí)行。
[0060]步驟S130,定位基于Hive的數(shù)據(jù)文件分區(qū)中查詢請(qǐng)求對(duì)應(yīng)的桶以及該桶中的列。[0061 ] 本實(shí)施例中,基于Hive的數(shù)據(jù)文件將存在于HDFS (Hadoop分布式文件系統(tǒng))的目錄中,每一數(shù)據(jù)文件均為數(shù)據(jù)表的形式,并具備相同的數(shù)據(jù)表結(jié)構(gòu),以便于進(jìn)行數(shù)據(jù)的快速查詢。
[0062]具體的,數(shù)據(jù)文件中存儲(chǔ)的數(shù)據(jù)即為表數(shù)據(jù),這些數(shù)據(jù)在Hive中進(jìn)行分區(qū)、分桶存儲(chǔ),也就是說(shuō),分區(qū)是在Hive中創(chuàng)建一個(gè)目錄,其目錄名為分區(qū)信息,然后將數(shù)據(jù)分桶存入該目錄中,以實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)的優(yōu)化過(guò)程,進(jìn)而使得在數(shù)據(jù)的查詢過(guò)程中只需要查找到數(shù)據(jù)