一種sql到云環(huán)境的映射方法及系統(tǒng)的制作方法
【專利摘要】本發(fā)明提供了一種SQL到云環(huán)境的映射方法,包括下列步驟:1)重寫待轉(zhuǎn)換SQL語(yǔ)句,獲得具有原待轉(zhuǎn)換SQL語(yǔ)句相同功能的多個(gè)重寫HiveQL語(yǔ)句;2)計(jì)算各個(gè)HiveQL語(yǔ)句的執(zhí)行代價(jià),選出最優(yōu)語(yǔ)句進(jìn)行輸出。本發(fā)明還提供了相應(yīng)的SQL到云環(huán)境的映射系統(tǒng)。本發(fā)明能夠在SQL語(yǔ)句映射到云環(huán)境的同時(shí),對(duì)云環(huán)境語(yǔ)句(例如HiveQL語(yǔ)句)進(jìn)行快速地優(yōu)化,進(jìn)而降低Mapper和Reducer實(shí)際輸入數(shù)據(jù)量,提升查詢性能。
【專利說(shuō)明】-種SQL到云環(huán)境的映射方法及系統(tǒng)
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及并行數(shù)據(jù)庫(kù)以及查詢重寫和查詢優(yōu)化【技術(shù)領(lǐng)域】,具體地說(shuō),本發(fā)明涉 及SQL到云環(huán)境的映射方法。
【背景技術(shù)】
[0002] MapReduce提供了一個(gè)高度抽象的編程模型,它允許用戶只需關(guān)注于兩個(gè)函數(shù) (Mapper和Reducer)功能的邏輯實(shí)現(xiàn),就可以快速地將他們的程序分布式地并行執(zhí)行在 多臺(tái)機(jī)器組成的集群當(dāng)中,而不需要關(guān)注諸如數(shù)據(jù)擺放和任務(wù)調(diào)度等底層系統(tǒng)問(wèn)題。隨著 云計(jì)算技術(shù)的興起,用于將高層抽象語(yǔ)言自動(dòng)轉(zhuǎn)換為Mapreduce任務(wù)流的Hive應(yīng)運(yùn)而生, 它極大提高了數(shù)據(jù)分析代碼的重用能力。Hive和Mapreduce都是當(dāng)前互聯(lián)網(wǎng)公司內(nèi)廣泛 應(yīng)用的技術(shù),許多公司用它們進(jìn)行網(wǎng)頁(yè)的索引創(chuàng)建、用戶行為分析以及商品推薦。然而,當(dāng) 軟件工程師試圖利用Hive來(lái)替代并加速之前運(yùn)行在RDBMS (關(guān)系型數(shù)據(jù)庫(kù))中的存儲(chǔ)過(guò) 程時(shí),將已有的SQL(Structured Query Language,結(jié)構(gòu)化查詢語(yǔ)言)轉(zhuǎn)換為正確、高效的 HiveQL(Hive所使用的申明型語(yǔ)言)通常面臨許多困難。
[0003] SQL至Mapreduce的自動(dòng)轉(zhuǎn)換和優(yōu)化近幾年受到了極大的關(guān)注,當(dāng)前已有的方 法主要包括:1.采用基于規(guī)則的方法來(lái)引導(dǎo)這種轉(zhuǎn)換以減少開銷,例如Google提出的 Tenzing系統(tǒng)。2.采用優(yōu)化算法來(lái)合并生成的多個(gè)Mapreduce任務(wù),以達(dá)到減少開銷的目 的,例如YSmart系統(tǒng)。這兩種技術(shù)都主要關(guān)注于Mapreduce層次的優(yōu)化,即直接將SQL語(yǔ) 句轉(zhuǎn)成MapReduce任務(wù),然后再采用優(yōu)化算法來(lái)合并所生成的多個(gè)MapReduce任務(wù)。現(xiàn)有 的這些優(yōu)化方案可以在一定程度上提高SQL至Mapreduce的自動(dòng)轉(zhuǎn)換的效率,但仍存在進(jìn) 一步提商的空間。
【發(fā)明內(nèi)容】
[0004] 因此,本發(fā)明的任務(wù)是克服現(xiàn)有技術(shù)的不足,幫助進(jìn)一步提高SQL到云環(huán)境(例如 Mapreduce)映射的效率的解決方案。
[0005] 為實(shí)現(xiàn)上述發(fā)明目的,本發(fā)明提供了一種SQL到云環(huán)境的映射方法,包括下列步 驟:
[0006] 1)重寫待轉(zhuǎn)換SQL語(yǔ)句,獲得具有原待轉(zhuǎn)換SQL語(yǔ)句相同功能的多個(gè)重寫HiveQL 語(yǔ)句;
[0007] 2)對(duì)于步驟1)所得的每個(gè)重寫HiveQL語(yǔ)句,分別計(jì)算其對(duì)應(yīng)的Mapreduce執(zhí)行 計(jì)劃的代價(jià),根據(jù)所計(jì)算的代價(jià)選出其中最優(yōu)的重寫HiveQL語(yǔ)句作為原SQL語(yǔ)句在云環(huán)境 中的映射。
[0008] 其中,所述步驟2)中,所述Mapreduce執(zhí)行計(jì)劃的代價(jià)是該Mapreduce執(zhí)行計(jì)劃 所產(chǎn)生的總的中間數(shù)據(jù)量。
[0009] 其中,所述步驟2)包括下列子步驟:
[0010] 21)對(duì)于每個(gè)HiveQL語(yǔ)句,分別查詢其對(duì)應(yīng)的Mapreduce執(zhí)行計(jì)劃以及所涉及到 的表的統(tǒng)計(jì)信息;
[0011] 22)利用基于概率的基數(shù)估計(jì)方法,將所述的所涉及到的表的統(tǒng)計(jì)信息代入,得到 所述Mapreduce執(zhí)行計(jì)劃中每個(gè)Mapper操作和每個(gè)Reducer操作所產(chǎn)生的中間數(shù)據(jù)量,然 后求和得到所述Mapreduce執(zhí)行計(jì)劃所產(chǎn)生的總的中間數(shù)據(jù)量;
[0012] 23)根據(jù)所計(jì)算的相應(yīng)Mapreduce執(zhí)行計(jì)劃所產(chǎn)生的總的中間數(shù)據(jù)量,選出最優(yōu) 的重寫HiveQL語(yǔ)句作為原SQL語(yǔ)句在云環(huán)境中的映射。
[0013] 其中,所述步驟21)中,所述的表的統(tǒng)計(jì)信息包括:表的各列的唯一值數(shù)量、各個(gè) 列的空值數(shù)量、各個(gè)列的最小值、各個(gè)列的最大值、各個(gè)列出現(xiàn)頻率最高的值分布以及各個(gè) 列的平均比特?cái)?shù)。
[0014] 其中,所述步驟1)包括下列子步驟:
[0015] 11)接收待轉(zhuǎn)換的SQL語(yǔ)句,將該SQL語(yǔ)句轉(zhuǎn)換成可編程操作的結(jié)構(gòu)化語(yǔ)法樹;
[0016] 12)掃描所述結(jié)構(gòu)化語(yǔ)法樹,依據(jù)預(yù)先定義的一系列的規(guī)則觸發(fā)重寫操作,得到多 個(gè)具有相同功能的HiveQL語(yǔ)句。
[0017] 其中,所述步驟12)中,所述預(yù)先定義的一系列的規(guī)則包括:增加缺失列、抽取隱 式JOIN、改寫EXISTS子查詢、改寫NOT EXISTS子查詢、改寫通過(guò)OR連接的EXISTS/N0T EXISTS子查詢、OR轉(zhuǎn)換為UNION、OR條件原地轉(zhuǎn)換、改寫UPDATE語(yǔ)句、改寫DELETE語(yǔ)句、改 寫MERGE INTO語(yǔ)句、調(diào)整JOIN順序的規(guī)則中的一項(xiàng)或多項(xiàng)。
[0018] 其中,所述調(diào)整JOIN順序的規(guī)則是:如果語(yǔ)句中存在多個(gè)JOIN,則采用組合方法 對(duì)參與JOIN的表進(jìn)行前后執(zhí)行順序的調(diào)整,從而形成多個(gè)不同的HiveQL語(yǔ)句。
[0019] 其中,所述改寫UPDATE語(yǔ)句的規(guī)則是:對(duì)于UPDATE形式的語(yǔ)句中存在的JOIN語(yǔ) 句,將其轉(zhuǎn)換為L(zhǎng)EFT OUTER JOIN語(yǔ)句,并在該UPDATE形式的語(yǔ)句的WHERE中新增某列IS NOT NULL的條件,接著利用增加缺失列的規(guī)則生成SELECT語(yǔ)句,最后再移除WHERE條件,并 將該條件移動(dòng)到對(duì)應(yīng)的SELECT語(yǔ)句中要被更新的列中,構(gòu)成判定條件;
[0020] 所述改寫DELETE語(yǔ)句的規(guī)則是:當(dāng)WHERE中存在EXISTS時(shí)會(huì)觸發(fā)LEFT OUTER JOIN改寫,對(duì)WHERE條件取反,把不需要?jiǎng)h除的那些行通過(guò)SELECT語(yǔ)句表達(dá)出來(lái);
[0021] 所述改寫MERGE INTO語(yǔ)句的規(guī)則是:如果MERGE INTO語(yǔ)句中包含WHEN NOT MATCHED子句,則將MERGE INTO語(yǔ)句轉(zhuǎn)換為FULL OUTER JOIN語(yǔ)句,并且,當(dāng)主表與子查詢 匹配時(shí)更新主表對(duì)應(yīng)的列,否則采用子查詢對(duì)應(yīng)列的值作為新值;如果MERGE INTO語(yǔ)句中 不包含WHEN NOT MATCHED子句,則該MERGE INTO語(yǔ)句退化為帶有JOIN條件的UPDATE語(yǔ) 句,用所述改寫UPDATE語(yǔ)句的規(guī)則進(jìn)行改寫。
[0022] 本發(fā)明還提供了一種SQL到云環(huán)境的映射系統(tǒng),包括:
[0023] SQL解釋器,用于接收待轉(zhuǎn)換的SQL語(yǔ)句,將該SQL語(yǔ)句轉(zhuǎn)換成可編程操作的結(jié)構(gòu) 化語(yǔ)法樹;
[0024] 查詢重寫器,用于掃描SQL解釋器所得到的結(jié)構(gòu)化語(yǔ)法樹,依據(jù)預(yù)先定義的一系 列的規(guī)則觸發(fā)重寫操作,得到多個(gè)與原SQL語(yǔ)句具有相同功能的HiveQL語(yǔ)句;
[0025] 統(tǒng)計(jì)信息收集器,用于收集Mapreduce執(zhí)行計(jì)劃中所涉及到的表的統(tǒng)計(jì)信息并將 其提供給計(jì)劃評(píng)估器;以及
[0026] 計(jì)劃評(píng)估器,用于根據(jù)每個(gè)HiveQL語(yǔ)句所對(duì)應(yīng)的Mapreduce執(zhí)行計(jì)劃和所涉及到 的表的統(tǒng)計(jì)信息,利用數(shù)據(jù)庫(kù)領(lǐng)域中的基于概率的基數(shù)估計(jì)方法,得到該Mapreduce執(zhí)行 計(jì)劃所產(chǎn)生的總的中間數(shù)據(jù)量,選擇所產(chǎn)生的總的中間數(shù)據(jù)量最小的HiveQL語(yǔ)句作為原 SQL語(yǔ)句在云環(huán)境中的映射。
[0027] 其中,所述計(jì)劃評(píng)估器還用于:對(duì)于Mapreduce執(zhí)行計(jì)劃,利用數(shù)據(jù)庫(kù)領(lǐng)域中的基 于概率的基數(shù)估計(jì)方法,將該Mapreduce執(zhí)行計(jì)劃所涉及到的表的統(tǒng)計(jì)信息代入,得到該 Mapreduce執(zhí)行計(jì)劃中每個(gè)Mapper操作和每個(gè)Reducer操作所產(chǎn)生的中間數(shù)據(jù)量,然后求 和得到該Mapreduce執(zhí)行計(jì)劃所產(chǎn)生的總的中間數(shù)據(jù)量。
[0028] 本發(fā)明還提供了另一種SQL到云環(huán)境的映射方法,包括下列步驟:
[0029] 1)重寫待轉(zhuǎn)換SQL語(yǔ)句,獲得具有原待轉(zhuǎn)換SQL語(yǔ)句相同功能的多個(gè)重寫HiveQL 語(yǔ)句,將原待轉(zhuǎn)換SQL語(yǔ)句映射到云環(huán)境;
[0030] 2)計(jì)算各個(gè)映射到云環(huán)境后的語(yǔ)句的執(zhí)行代價(jià),選出執(zhí)行代價(jià)最小的HiveQL語(yǔ) 句進(jìn)行輸出。
[0031] 其中,所述步驟2)還包括:對(duì)于每個(gè)HiveQL語(yǔ)句,分別查詢其對(duì)應(yīng)的Mapreduce 執(zhí)行計(jì)劃以及所涉及到的表的統(tǒng)計(jì)信息,所述表的統(tǒng)計(jì)信息包括:各列的唯一值數(shù)量、各個(gè) 列的空值數(shù)量、各個(gè)列的最小值、各個(gè)列的最大值、各個(gè)列出現(xiàn)頻率最高的值分布以及各個(gè) 列的平均比特?cái)?shù)中的一項(xiàng)或多項(xiàng);所述步驟2)還包括:基于所涉及到的表的統(tǒng)計(jì)信息,計(jì) 算每個(gè)HiveQL語(yǔ)句的查詢執(zhí)行計(jì)劃的代價(jià),根據(jù)這個(gè)代價(jià)確定最優(yōu)的HiveQL語(yǔ)句。
[0032] 與現(xiàn)有技術(shù)相比,本發(fā)明具有下列技術(shù)效果:
[0033] 本發(fā)明能夠在SQL語(yǔ)句映射到云環(huán)境的同時(shí),對(duì)云環(huán)境語(yǔ)句(例如HiveQL語(yǔ)句) 進(jìn)行快速地優(yōu)化,進(jìn)而降低Mapper和Reducer實(shí)際輸入數(shù)據(jù)量,提升查詢性能。
【專利附圖】
【附圖說(shuō)明】
[0034] 以下,結(jié)合附圖來(lái)詳細(xì)說(shuō)明本發(fā)明的實(shí)施例,其中:
[0035] 圖1示出了本發(fā)明一個(gè)實(shí)施例的將SQL語(yǔ)句轉(zhuǎn)換為高效HiveQL查詢語(yǔ)言的系統(tǒng) 的結(jié)構(gòu)不意圖;
[0036] 圖2不出了本發(fā)明一個(gè)實(shí)施例中用于解析隱式JOIN關(guān)系的依賴圖;
[0037] 圖3示出了本發(fā)明一個(gè)實(shí)施例與現(xiàn)有方案的轉(zhuǎn)換后語(yǔ)句的查詢時(shí)間的對(duì)比;
[0038] 圖4示出了本發(fā)明一個(gè)實(shí)施例與現(xiàn)有方案的轉(zhuǎn)換后語(yǔ)句的查詢中的實(shí)際輸入數(shù) 據(jù)量的對(duì)比;
[0039] 圖5示出了一個(gè)將SQL語(yǔ)句轉(zhuǎn)換為高效HiveQL查詢語(yǔ)言的典型示例中結(jié)構(gòu)化語(yǔ) 法樹的示例;
[0040] 圖6示出了一個(gè)將SQL語(yǔ)句轉(zhuǎn)換為高效HiveQL查詢語(yǔ)言的典型示例中轉(zhuǎn)換1生 成的執(zhí)行計(jì)劃;
[0041] 圖7示出了一個(gè)將SQL語(yǔ)句轉(zhuǎn)換為高效HiveQL查詢語(yǔ)言的典型示例中轉(zhuǎn)換2生 成的執(zhí)行計(jì)劃。
【具體實(shí)施方式】
[0042] 發(fā)明人研究發(fā)現(xiàn),現(xiàn)有的SQL至Mapreduce的自動(dòng)轉(zhuǎn)換方案大都關(guān)注于Mapreduce 層次的優(yōu)化,而忽略了相同邏輯條件下的SQL語(yǔ)句的多樣性(同一個(gè)功能可由不同的SQL 語(yǔ)句實(shí)現(xiàn)),以及這種多樣性所帶來(lái)的性能差異。針對(duì)這一問(wèn)題,本發(fā)明提出了一種基于規(guī) 則的查詢重寫優(yōu)化方法,來(lái)引導(dǎo)SQL至HiveQL的轉(zhuǎn)換,生成多個(gè)轉(zhuǎn)換方案,并且提出了基于 代價(jià)的評(píng)估方法來(lái)選擇最優(yōu)的轉(zhuǎn)換方案,從而達(dá)到減少開銷的目的。其中HiveQL語(yǔ)言可以 看做SQL語(yǔ)言中與Hive兼容的子集。
[0043] 概括來(lái)說(shuō),本發(fā)明提供了一種將SQL語(yǔ)句轉(zhuǎn)換為高效HiveQL查詢語(yǔ)言的方法,從 而實(shí)現(xiàn)SQL到云環(huán)境的映射,該方法包括下列步驟:
[0044] 步驟1 :接收來(lái)自用戶的SQL語(yǔ)句,并將該語(yǔ)句轉(zhuǎn)換成可編程操作的結(jié)構(gòu)化語(yǔ)法 樹。
[0045] 步驟2 :對(duì)結(jié)構(gòu)化語(yǔ)法樹進(jìn)行調(diào)整,依據(jù)每個(gè)重寫規(guī)則掃描輸入的語(yǔ)法樹,當(dāng)滿 足一定條件時(shí)便觸發(fā)重寫操作,從而得到多個(gè)具有相同功能的SQL語(yǔ)句,進(jìn)而轉(zhuǎn)換為多個(gè) Hive可接受的HiveQL語(yǔ)句。本領(lǐng)域技術(shù)人員易于理解,這里轉(zhuǎn)換后獲得的每個(gè)HiveQL語(yǔ) 句都能夠?qū)崿F(xiàn)與原SQL語(yǔ)句相同的功能,即每個(gè)HiveQL語(yǔ)句都對(duì)應(yīng)于一套轉(zhuǎn)換方案。
[0046] 步驟3 :對(duì)于每個(gè)Hive可接受的HiveQL語(yǔ)句,分別查詢其對(duì)應(yīng)的Mapreduce執(zhí)行 計(jì)劃以及所涉及到的表的統(tǒng)計(jì)信息。目前針對(duì)各個(gè)表收集的統(tǒng)計(jì)信息主要包括:各列的唯 一值數(shù)量、各個(gè)列的空值數(shù)量、各個(gè)列的最小值、各個(gè)列的最大值、各個(gè)列出現(xiàn)頻率最高的 值分布以及各個(gè)列的平均比特?cái)?shù)。另外,本領(lǐng)域技術(shù)人員易于理解,Mapreduce執(zhí)行計(jì)劃所 涉及到的表指的是被作為Mapreduce執(zhí)行計(jì)劃中的操作對(duì)象的表。
[0047] 步驟4 :基于所涉及到的表的統(tǒng)計(jì)信息,計(jì)算每個(gè)HiveQL語(yǔ)句的查詢執(zhí)行計(jì)劃的 代價(jià),根據(jù)這個(gè)代價(jià)確定最優(yōu)的HiveQL語(yǔ)句。
[0048] 本發(fā)明考慮了相同邏輯條件下的SQL語(yǔ)句的多樣性,生成多個(gè)轉(zhuǎn)換方案,然后根 據(jù)基于代價(jià)的評(píng)估方法來(lái)選擇最優(yōu)的轉(zhuǎn)換方案,從而達(dá)到減少開銷的目的。并且,本發(fā)明是 處于查詢語(yǔ)句層次的優(yōu)化,它可以和MapReduce層次的優(yōu)化工具(如YSmart)結(jié)合起來(lái)使 用,從而進(jìn)一步地提高SQL至MapReduce任務(wù)的轉(zhuǎn)換效率。
[0049] 為了使本發(fā)明更加清楚明白,下面將結(jié)合實(shí)施例對(duì)本發(fā)明進(jìn)行描述。
[0050] 一、將SQL語(yǔ)句轉(zhuǎn)換為高效HiveQL查詢語(yǔ)言
[0051] 圖1示出了本實(shí)施例提供的一種將SQL語(yǔ)句轉(zhuǎn)換為高效HiveQL查詢語(yǔ)言的系統(tǒng) 的結(jié)構(gòu)示意圖,該系統(tǒng)包括:SQL Interpreter (SQL解釋器)、Query Rewriter (查詢重寫 器)、Plan Evaluator (計(jì)劃評(píng)估器)和Statistics Collector (統(tǒng)計(jì)信息收集器)。下面 分別介紹這4個(gè)部分。
[0052] I. SQL Interpreter (SQL 解釋器)
[0053] SQL解釋器是利用ANTLR自行開發(fā)的一個(gè)用于解析PLSQL語(yǔ)句的語(yǔ)法分析器,該解 釋器的目的是用于接收來(lái)自用戶的SQL語(yǔ)句,并將該語(yǔ)句轉(zhuǎn)換成可編程操作的結(jié)構(gòu)化語(yǔ)法 樹。
[0054] 2. Query Rewriter (查詢重寫器)
[0055] 查詢重寫器接收來(lái)自SQL解釋器輸出的結(jié)構(gòu)化語(yǔ)法樹,并在此語(yǔ)法樹基礎(chǔ)上對(duì)其 進(jìn)行調(diào)整,查詢重寫器內(nèi)部的核心部分為重寫規(guī)則庫(kù),查詢重寫器會(huì)依據(jù)每個(gè)重寫規(guī)則掃 描輸入的語(yǔ)法樹,當(dāng)滿足一定條件時(shí)便觸發(fā)重寫操作,最終會(huì)得到多個(gè)(當(dāng)多個(gè)規(guī)則被觸 發(fā)時(shí))Hive可接受的HiveQL語(yǔ)句。
[0056] 3. Plan Evaluator (計(jì)劃評(píng)估器)
[0057] 查詢重寫器輸出的多個(gè)HiveQL語(yǔ)句,會(huì)進(jìn)一步交給Hive本身的查詢編譯器進(jìn)行 解釋,進(jìn)而能夠得到查詢各自對(duì)應(yīng)的Mapreduce執(zhí)行計(jì)劃(包含了多個(gè)Mapreduce任務(wù)及 其內(nèi)部操作符的邏輯描述),該執(zhí)行計(jì)劃和所涉及到的表的統(tǒng)計(jì)信息作為計(jì)劃評(píng)估器的輸 入,計(jì)劃評(píng)估器利用數(shù)據(jù)庫(kù)領(lǐng)域中的基數(shù)估計(jì)技術(shù),結(jié)合本發(fā)明提出的代價(jià)模型,計(jì)算各個(gè) 執(zhí)行計(jì)劃的代價(jià),最終代價(jià)最小的計(jì)劃所對(duì)應(yīng)的HiveQL語(yǔ)句會(huì)被選擇為最終的轉(zhuǎn)換結(jié)果。
[0058] 4. Statistics Collector (統(tǒng)計(jì)信息收集器)
[0059] 統(tǒng)計(jì)信息收集器用于定時(shí)收集Hive中各個(gè)表的統(tǒng)計(jì)信息,該統(tǒng)計(jì)信息主要提供 給計(jì)劃評(píng)估器幫助其計(jì)算查詢執(zhí)行計(jì)劃的代價(jià),目前針對(duì)各個(gè)表收集的統(tǒng)計(jì)信息主要包 括:各列的唯一值數(shù)量、各個(gè)列的空值數(shù)量、各個(gè)列的最小值、各個(gè)列的最大值、各個(gè)列出現(xiàn) 頻率最高的值分布以及各個(gè)列的平均比特?cái)?shù)。
[0060] 二、SQL至HiveQL自動(dòng)轉(zhuǎn)換的方法
[0061] 查詢重寫器中,SQL至HiveQL自動(dòng)轉(zhuǎn)換的方法是基于規(guī)則的,因此本實(shí)施例中定 義了一系列的規(guī)則來(lái)引導(dǎo)轉(zhuǎn)換,每當(dāng)規(guī)則的條件被滿足時(shí),規(guī)則就會(huì)觸發(fā)并應(yīng)用于當(dāng)前查 詢,從而生成一個(gè)新的查詢語(yǔ)句,最終所有規(guī)則被應(yīng)用完成時(shí),將會(huì)生成若干個(gè)與原SQL語(yǔ) 句等價(jià)的HiveQL語(yǔ)句(生成若干個(gè)等價(jià)的查詢語(yǔ)句是因?yàn)橛幸?guī)則有不同的轉(zhuǎn)換方法)。查 詢重寫器的核心規(guī)則包括:
[0062] 規(guī)則1.增加缺失列
[0063] 觸發(fā)條件:任意 UPDATE、DELETE、MERGE INTO、INSERT 語(yǔ)句
[0064] 轉(zhuǎn)換規(guī)則:考慮如下SQL語(yǔ)句,具有關(guān)系Rl (A, B,C,D),R2 (E,F(xiàn),G,H)
[0065] INSERT INTO Rl (A, B,C) - Ql
[0066] SELECT E,F(xiàn),G FROM R2 - Q2
[0067] 查詢將R2中的某些列插入到Rl當(dāng)中,為了方便,SQL語(yǔ)句直接指明了對(duì)應(yīng)Rl表 中的列(A,B,C),而D列會(huì)被數(shù)據(jù)庫(kù)設(shè)置為默認(rèn)值null或者是其他用戶指定的數(shù)值。但是 在Hive中,INSERT是無(wú)法簡(jiǎn)化的,查詢重寫器會(huì)掃描原RDBMS中對(duì)應(yīng)表所擁有的列以及它 們的默認(rèn)值,自動(dòng)完成對(duì)這些列的擴(kuò)充,轉(zhuǎn)換結(jié)果如下:
[0068] INSERT OVERWRITE TABLE Rl
[0069] SELECT E,F(xiàn),G,-IAS D FROM R2
[0070] 概括地說(shuō),規(guī)則I就是在滿足前述觸發(fā)條件時(shí),將原SQL語(yǔ)句轉(zhuǎn)換為掃描原關(guān)系數(shù) 據(jù)庫(kù)并了增加了缺失列的HiveQL語(yǔ)句。
[0071] 規(guī)則2?抽取隱式JOIN
[0072] 觸發(fā)條件:語(yǔ)句中的FROM中存在多個(gè)表
[0073] 轉(zhuǎn)換規(guī)則:考慮如下SQL語(yǔ)句,具有關(guān)系Rl (A, B,C,D),R2 (E,F(xiàn),G,H),R3 (H,M)
[0074] INSERT INTO Rl (A, B, C, D)
[0075] SELECT E, F, G, M FROM R2, R3WHERE R2. H = R3. H
[0076] 假設(shè)在這個(gè)例子中R2和R3中的數(shù)據(jù)是一一對(duì)應(yīng)的,顯然該查詢使用了一個(gè)隱式 的JOIN操作,將R2和R3進(jìn)行匹配,在關(guān)系數(shù)據(jù)庫(kù)中,隱式JOIN和INNER JOIN是等價(jià)的, 因此在對(duì)一個(gè)單一的查詢轉(zhuǎn)換之前,查詢重寫器會(huì)分析其中存在的隱式JOIN,并將它改寫 成Hive中支持的JOIN模式。這個(gè)過(guò)程是直接的,上面的例子可以轉(zhuǎn)換為:
[0077] INSERT OVERWRITE TABLE Rl
[0078] SELECT E, F, G, M FROM R2J0IN R30N R2. H = R3. H
[0079] 當(dāng)有多張表參與了隱式的JOIN時(shí),查詢重寫器通過(guò)構(gòu)造一個(gè)依賴圖來(lái)解析隱式 JOIN關(guān)系,如圖2所示。該JOIN關(guān)系可以從以下語(yǔ)句中解析出來(lái):
[0080] …? SELECT…FROM Rl,R2, R3, R4WHERE RL A = R2. A AND RL B = R3. B AND R2. C =R3. C AND R3. D = R4. D-
[0081] 通過(guò)遍歷WHERE中的條件,查詢重寫器將構(gòu)造出上圖對(duì)應(yīng)的依賴關(guān)系,接著任意 選取一個(gè)節(jié)點(diǎn)作為主表然后進(jìn)行寬度優(yōu)先搜索,可以構(gòu)造出等價(jià)的JOIN操作,在該例子 中,算法從沿著R3->R4->R1->R2->R1的順序進(jìn)行遍歷,得到JOIN關(guān)系:
[0082] …SELECT…FROM R3J0IN R40N R3. D = R4. D JOIN RlON R3. B = RL B JOIN R20N R3. C = R2. C AND RL A = R2. A
[0083] 注意到,當(dāng)?shù)诙卧L問(wèn)Rl節(jié)點(diǎn)準(zhǔn)備JOIN R2時(shí),會(huì)發(fā)現(xiàn)R2已經(jīng)被R3節(jié)點(diǎn)JOIN 了, 此時(shí)只需要直接把Rl和R2的JOIN關(guān)系添加到JOIN R2的條件中(ON R3. C = R2. C AND RL A = R2. A)。
[0084] 概括地說(shuō),規(guī)則2就是在滿足前述觸發(fā)條件時(shí),將原SQL語(yǔ)句的WHERE條件中的 JOIN等式顯式地列在JOIN表的ON條件中,從而得到能夠完成相同功能的HiveQL語(yǔ)句。
[0085] 規(guī)則3?改寫EXISTS子查詢
[0086] 觸發(fā)條件:語(yǔ)句Where條件中存在EXISTS子查詢
[0087] 轉(zhuǎn)換規(guī)則:
[0088]
【權(quán)利要求】
1. 一種SQL到云環(huán)境的映射方法,包括下列步驟: 1) 重寫待轉(zhuǎn)換SQL語(yǔ)句,獲得具有原待轉(zhuǎn)換SQL語(yǔ)句相同功能的多個(gè)重寫HiveQL語(yǔ) 句; 2) 對(duì)于步驟1)所得的每個(gè)重寫HiveQL語(yǔ)句,分別計(jì)算其對(duì)應(yīng)的Mapreduce執(zhí)行計(jì)劃 的代價(jià),根據(jù)所計(jì)算的代價(jià)選出其中最優(yōu)的重寫HiveQL語(yǔ)句作為原SQL語(yǔ)句在云環(huán)境中的 映射。
2. 根據(jù)權(quán)利要求1所述的SQL到云環(huán)境的映射方法,其特征在于,所述步驟2)中,所述 Mapreduce執(zhí)行計(jì)劃的代價(jià)是該Mapreduce執(zhí)行計(jì)劃所產(chǎn)生的總的中間數(shù)據(jù)量。
3. 根據(jù)權(quán)利要求2所述的SQL到云環(huán)境的映射方法,其特征在于,所述步驟2)包括下 列子步驟: 21) 對(duì)于每個(gè)HiveQL語(yǔ)句,分別查詢其對(duì)應(yīng)的Mapreduce執(zhí)行計(jì)劃以及所涉及到的表 的統(tǒng)計(jì)信息; 22) 利用基于概率的基數(shù)估計(jì)方法,將所述的所涉及到的表的統(tǒng)計(jì)信息代入,得到所述 Mapreduce執(zhí)行計(jì)劃中每個(gè)Mapper操作和每個(gè)Reducer操作所產(chǎn)生的中間數(shù)據(jù)量,然后求 和得到所述Mapreduce執(zhí)行計(jì)劃所產(chǎn)生的總的中間數(shù)據(jù)量; 23) 根據(jù)所計(jì)算的相應(yīng)Mapreduce執(zhí)行計(jì)劃所產(chǎn)生的總的中間數(shù)據(jù)量,選出最優(yōu)的重 寫HiveQL語(yǔ)句作為原SQL語(yǔ)句在云環(huán)境中的映射。
4. 根據(jù)權(quán)利要求3所述的SQL到云環(huán)境的映射方法,其特征在于,所述步驟21)中,所 述的表的統(tǒng)計(jì)信息包括:表的各列的唯一值數(shù)量、各個(gè)列的空值數(shù)量、各個(gè)列的最小值、各 個(gè)列的最大值、各個(gè)列出現(xiàn)頻率最高的值分布以及各個(gè)列的平均比特?cái)?shù)。
5. 根據(jù)權(quán)利要求1所述的SQL到云環(huán)境的映射方法,其特征在于,所述步驟1)包括下 列子步驟: 11) 接收待轉(zhuǎn)換的SQL語(yǔ)句,將該SQL語(yǔ)句轉(zhuǎn)換成可編程操作的結(jié)構(gòu)化語(yǔ)法樹; 12) 掃描所述結(jié)構(gòu)化語(yǔ)法樹,依據(jù)預(yù)先定義的一系列的規(guī)則觸發(fā)重寫操作,得到多個(gè)具 有相同功能的HiveQL語(yǔ)句。
6. 根據(jù)權(quán)利要求5所述的SQL到云環(huán)境的映射方法,其特征在于,所述步驟12)中,所 述預(yù)先定義的一系列的規(guī)則包括:增加缺失列、抽取隱式JOIN、改寫EXISTS子查詢、改寫 NOT EXISTS子查詢、改寫通過(guò)OR連接的EXISTS/NOT EXISTS子查詢、OR轉(zhuǎn)換為UNION、OR 條件原地轉(zhuǎn)換、改寫UPDATE語(yǔ)句、改寫DELETE語(yǔ)句、改寫MERGE INTO語(yǔ)句、調(diào)整JOIN順序 的規(guī)則中的一項(xiàng)或多項(xiàng)。
7. 根據(jù)權(quán)利要求6所述的SQL到云環(huán)境的映射方法,其特征在于,所述調(diào)整JOIN順序 的規(guī)則是:如果語(yǔ)句中存在多個(gè)JOIN,則采用組合方法對(duì)參與JOIN的表進(jìn)行前后執(zhí)行順序 的調(diào)整,從而形成多個(gè)不同的HiveQL語(yǔ)句。
8. 根據(jù)權(quán)利要求6所述的SQL到云環(huán)境的映射方法,其特征在于,所述改寫UPDATE語(yǔ) 句的規(guī)則是:對(duì)于UPDATE形式的語(yǔ)句中存在的JOIN語(yǔ)句,將其轉(zhuǎn)換為L(zhǎng)EFT OUTER JOIN語(yǔ) 句,并在該UPDATE形式的語(yǔ)句的WHERE中新增某列IS NOT NULL的條件,接著利用增加缺 失列的規(guī)則生成SELECT語(yǔ)句,最后再移除WHERE條件,并將該條件移動(dòng)到對(duì)應(yīng)的SELECT語(yǔ) 句中要被更新的列中,構(gòu)成判定條件; 所述改寫MERGE INTO語(yǔ)句的規(guī)則是:如果MERGE INTO語(yǔ)句中包含WHEN NOT MATCHED 子句,則將MERGE INTO語(yǔ)句轉(zhuǎn)換為FULL OUTER JOIN語(yǔ)句,并且,當(dāng)主表與子查詢匹配時(shí) 更新主表對(duì)應(yīng)的列,否則采用子查詢對(duì)應(yīng)列的值作為新值;如果MERGE INTO語(yǔ)句中不包含 WHEN NOT MATCHED子句,則該MERGE INTO語(yǔ)句退化為帶有JOIN條件的UPDATE語(yǔ)句,用所 述改寫UPDATE語(yǔ)句的規(guī)則進(jìn)行改寫。
9. 一種SQL到云環(huán)境的映射系統(tǒng),包括: SQL解釋器,用于接收待轉(zhuǎn)換的SQL語(yǔ)句,將該SQL語(yǔ)句轉(zhuǎn)換成可編程操作的結(jié)構(gòu)化語(yǔ) 法樹; 查詢重寫器,用于掃描SQL解釋器所得到的結(jié)構(gòu)化語(yǔ)法樹,依據(jù)預(yù)先定義的一系列的 規(guī)則觸發(fā)重寫操作,得到多個(gè)與原SQL語(yǔ)句具有相同功能的HiveQL語(yǔ)句; 統(tǒng)計(jì)信息收集器,用于收集Mapreduce執(zhí)行計(jì)劃中所涉及到的表的統(tǒng)計(jì)信息并將其提 供給計(jì)劃評(píng)估器;以及 計(jì)劃評(píng)估器,用于根據(jù)每個(gè)HiveQL語(yǔ)句所對(duì)應(yīng)的Mapreduce執(zhí)行計(jì)劃和所涉及到的表 的統(tǒng)計(jì)信息,利用數(shù)據(jù)庫(kù)領(lǐng)域中的基于概率的基數(shù)估計(jì)方法,得到該Mapreduce執(zhí)行計(jì)劃 所產(chǎn)生的總的中間數(shù)據(jù)量,選擇所產(chǎn)生的總的中間數(shù)據(jù)量最小的HiveQL語(yǔ)句作為原SQL語(yǔ) 句在云環(huán)境中的映射。
10. 根據(jù)權(quán)利要求9所述的SQL到云環(huán)境的映射系統(tǒng),其特征在于,所述計(jì)劃評(píng)估器 還用于:對(duì)于Mapreduce執(zhí)行計(jì)劃,利用數(shù)據(jù)庫(kù)領(lǐng)域中的基于概率的基數(shù)估計(jì)方法,將該 Mapreduce執(zhí)行計(jì)劃所涉及到的表的統(tǒng)計(jì)信息代入,得到該Mapreduce執(zhí)行計(jì)劃中每個(gè) Mapper操作和每個(gè)Reducer操作所產(chǎn)生的中間數(shù)據(jù)量,然后求和得到該Mapreduce執(zhí)行計(jì) 劃所產(chǎn)生的總的中間數(shù)據(jù)量。
11. 一種SQL到云環(huán)境的映射方法,包括下列步驟: 1) 重寫待轉(zhuǎn)換SQL語(yǔ)句,獲得具有原待轉(zhuǎn)換SQL語(yǔ)句相同功能的多個(gè)重寫HiveQL語(yǔ) 句,將原待轉(zhuǎn)換SQL語(yǔ)句映射到云環(huán)境; 2) 計(jì)算各個(gè)映射到云環(huán)境后的語(yǔ)句的執(zhí)行代價(jià),選出執(zhí)行代價(jià)最小的HiveQL語(yǔ)句進(jìn) 行輸出。
12. 根據(jù)權(quán)利要求11所述的SQL到云環(huán)境的映射方法,其特征在于,所述步驟2)還包 括:對(duì)于每個(gè)HiveQL語(yǔ)句,分別查詢其對(duì)應(yīng)的Mapreduce執(zhí)行計(jì)劃以及所涉及到的表的統(tǒng) 計(jì)信息,所述表的統(tǒng)計(jì)信息包括:各列的唯一值數(shù)量、各個(gè)列的空值數(shù)量、各個(gè)列的最小值、 各個(gè)列的最大值、各個(gè)列出現(xiàn)頻率最高的值分布以及各個(gè)列的平均比特?cái)?shù)中的一項(xiàng)或多 項(xiàng);所述步驟2)還包括:基于所涉及到的表的統(tǒng)計(jì)信息,計(jì)算每個(gè)HiveQL語(yǔ)句的查詢執(zhí)行 計(jì)劃的代價(jià),根據(jù)這個(gè)代價(jià)確定最優(yōu)的HiveQL語(yǔ)句。
【文檔編號(hào)】G06F17/30GK104408134SQ201410708225
【公開日】2015年3月11日 申請(qǐng)日期:2014年11月28日 優(yōu)先權(quán)日:2013年11月28日
【發(fā)明者】徐英鐘, 虎嵩林, 蘇伊鵬, 陳建, 吳凱鋒, 李祥珍, 王志強(qiáng), 張春光, 裘煒浩, 肖政, 衡星辰 申請(qǐng)人:中國(guó)科學(xué)院計(jì)算技術(shù)研究所, 國(guó)網(wǎng)浙江省電力公司信息通信分公司