大數(shù)據(jù)技術(shù)原理與操作應(yīng)用 第7章 Hive 數(shù)據(jù)倉(cāng)庫(kù)_第1頁(yè)
大數(shù)據(jù)技術(shù)原理與操作應(yīng)用 第7章 Hive 數(shù)據(jù)倉(cāng)庫(kù)_第2頁(yè)
大數(shù)據(jù)技術(shù)原理與操作應(yīng)用 第7章 Hive 數(shù)據(jù)倉(cāng)庫(kù)_第3頁(yè)
大數(shù)據(jù)技術(shù)原理與操作應(yīng)用 第7章 Hive 數(shù)據(jù)倉(cāng)庫(kù)_第4頁(yè)
大數(shù)據(jù)技術(shù)原理與操作應(yīng)用 第7章 Hive 數(shù)據(jù)倉(cāng)庫(kù)_第5頁(yè)
已閱讀5頁(yè),還剩92頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第7章Hive數(shù)據(jù)倉(cāng)庫(kù)1Hive的相關(guān)功能和特點(diǎn)Hive的安裝和配置HiveQL的相關(guān)操作2?學(xué)習(xí)目標(biāo)了解熟悉了解掌握了解Hive的相關(guān)功能12了解Hive的特點(diǎn)4Hive的安裝和配置3掌握HiveQL的相關(guān)操作章節(jié)概要ApacheHive是架構(gòu)在Hadoop之上的一個(gè)數(shù)據(jù)倉(cāng)庫(kù)工具,是一款為Hadoop解決大數(shù)據(jù)管理和處理難題的框架,可以方便地進(jìn)行大數(shù)據(jù)存儲(chǔ)、查詢和分析。Hive能夠?qū)⒔Y(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫(kù)表,并提供類SQL查詢功能,能夠?qū)QL語(yǔ)句轉(zhuǎn)變成MapReduce任務(wù)來(lái)執(zhí)行,十分適合數(shù)據(jù)倉(cāng)庫(kù)的統(tǒng)計(jì)分析。

7.1Hive基礎(chǔ)7.1.1數(shù)據(jù)倉(cāng)庫(kù)概述1)數(shù)據(jù)倉(cāng)庫(kù)面向主題2)數(shù)據(jù)倉(cāng)庫(kù)數(shù)據(jù)集成3)數(shù)據(jù)倉(cāng)庫(kù)不可更新4)數(shù)據(jù)倉(cāng)庫(kù)隨時(shí)間變化(1)數(shù)據(jù)倉(cāng)庫(kù)特征

7.1Hive基礎(chǔ)7.1.1數(shù)據(jù)倉(cāng)庫(kù)概述數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng)是一個(gè)信息提供平臺(tái),它從業(yè)務(wù)處理系統(tǒng)獲得數(shù)據(jù),主要以星型模型和雪花型模型進(jìn)行數(shù)據(jù)組合,并為用戶提供各種手段,從數(shù)據(jù)中獲取信息和知識(shí)。1)業(yè)務(wù)建模2)領(lǐng)域概念建模3)邏輯建模4)物理建模(3)數(shù)據(jù)倉(cāng)庫(kù)的數(shù)據(jù)建模

7.1Hive基礎(chǔ)7.1.1數(shù)據(jù)倉(cāng)庫(kù)概述數(shù)據(jù)倉(cāng)庫(kù)并不是所謂的“大型數(shù)據(jù)庫(kù)”,它的建設(shè)目的是為了進(jìn)一步從海量數(shù)據(jù)集中挖掘數(shù)據(jù)資源,從而進(jìn)行決策。數(shù)據(jù)庫(kù)一般稱為聯(lián)機(jī)事務(wù)處理OLTP(On-LineTransactionProcessing),是面向事務(wù)設(shè)計(jì)的,數(shù)據(jù)量較少,在設(shè)計(jì)上應(yīng)盡量避免冗余,可實(shí)現(xiàn)更新操作。數(shù)據(jù)倉(cāng)庫(kù)一般稱為聯(lián)機(jī)分析處理OLAP(On-LineAnalyticalProcessing),是面向主題設(shè)計(jì)的,存儲(chǔ)的一般是歷史數(shù)據(jù),在設(shè)計(jì)上期望冗余,不支持更新操作,只能讀取和追加數(shù)據(jù)。(2)數(shù)據(jù)倉(cāng)庫(kù)和數(shù)據(jù)庫(kù)的區(qū)別

7.1Hive基礎(chǔ)7.1.2 Hive簡(jiǎn)介Hive最初由Facebook開(kāi)發(fā),用于Facebook的日志分析,后來(lái)成為Apahce軟件基金會(huì)的一個(gè)開(kāi)源的頂級(jí)項(xiàng)目,是一個(gè)通用的、可伸縮的數(shù)據(jù)處理平臺(tái),很多公司和組織將Hive作為大數(shù)據(jù)平臺(tái)中用于數(shù)據(jù)倉(cāng)庫(kù)分析的核心組件。Hive是基于Hadoop的一套數(shù)據(jù)倉(cāng)庫(kù)分析系統(tǒng),用來(lái)對(duì)海量結(jié)構(gòu)化數(shù)據(jù)進(jìn)行提取、轉(zhuǎn)化、加載、存儲(chǔ)、查詢和分析,可以將存儲(chǔ)在Hadoop分布式文件系統(tǒng)(如HDFS)中的海量結(jié)構(gòu)化數(shù)據(jù)映射為數(shù)據(jù)庫(kù)表,并提供豐富的類SQL查詢方式來(lái)進(jìn)行分析。這套SQL又稱為“HiveSQL”,簡(jiǎn)稱“HQL”。HQL可以使得不熟悉MapReduce的用戶能很方便地利用SQL語(yǔ)言查詢、匯總和分析數(shù)據(jù),Hive最終將這些HQL語(yǔ)句轉(zhuǎn)換為MapReduce任務(wù)進(jìn)行處理。Hive構(gòu)建在基于靜態(tài)批處理的Hadoop之上,并不能夠在大規(guī)模數(shù)據(jù)集上實(shí)現(xiàn)低延遲快速的查詢,也不適合像聯(lián)機(jī)事務(wù)處理這類的高實(shí)性的應(yīng)用。Hive最適合像網(wǎng)絡(luò)日志分析這類的基于大量不可變的批處理作業(yè)。

7.1Hive基礎(chǔ)7.1.3 Hive組成架構(gòu)

7.1Hive基礎(chǔ)7.1.3 Hive組成架構(gòu)(1)用戶接口用戶接口也就是Hive的客戶端,主要有三個(gè):Web接口、CLI接口和JDBC/ODBC客戶端。用戶可以通過(guò)Hive的用戶接口與底層數(shù)據(jù)存儲(chǔ)系統(tǒng)進(jìn)行互動(dòng)。Web接口就是通過(guò)Web瀏覽器訪問(wèn)、操作和管理Hive,非常方便直觀。CLI接口即Hive的命令行接口,這是最常用的客戶端。JDBC/ODBC客戶端指應(yīng)用程序通過(guò)JDBC或ODBC協(xié)議連接至Hive,從而發(fā)送執(zhí)行命令。

7.1Hive基礎(chǔ)7.1.3 Hive組成架構(gòu)(2)Hive驅(qū)動(dòng)引擎Hive驅(qū)動(dòng)引擎是Hive的核心,包括四個(gè)部分:SQLParser解析器、PhysicalPlan編譯器、QueryOptimizer優(yōu)化器和Execution執(zhí)行器。用戶通過(guò)Hive接口發(fā)送HQL,Hive通過(guò)驅(qū)動(dòng)引擎結(jié)合MetaStore元數(shù)據(jù),將HQL翻譯成MapReduce去執(zhí)行。首先,使用SQLParser解析器將HQL語(yǔ)句轉(zhuǎn)換成語(yǔ)法樹(shù),接著使用PhysicalPlan編譯器將語(yǔ)法樹(shù)編譯為邏輯執(zhí)行計(jì)劃,然后通過(guò)QueryOptimizer優(yōu)化器對(duì)邏輯執(zhí)行計(jì)劃進(jìn)行優(yōu)化,最后將優(yōu)化的結(jié)果使用Execution執(zhí)行器調(diào)用底層MapReduce框架執(zhí)行邏輯執(zhí)行計(jì)劃。

7.1Hive基礎(chǔ)7.1.3 Hive組成架構(gòu)(3)元數(shù)據(jù)庫(kù)Hive選擇一些關(guān)系型數(shù)據(jù)庫(kù)(如MySQL、Derby等),用來(lái)存放Hive的基礎(chǔ)信息。默認(rèn)使用的是Derby。(4)HadoopHive是構(gòu)建在Hadoop之上的,其數(shù)據(jù)文件存儲(chǔ)在底層的HDFS或HBASE中,通過(guò)Ma-pReduce框架完成Hive的查詢工作,并將結(jié)果返回給客戶端。

7.1Hive基礎(chǔ)7.1.4Hive工作原理

7.1Hive基礎(chǔ)7.1.4Hive工作原理(1)ExecuteQuery用戶通過(guò)Hive接口(如命令行或Web接口)發(fā)送查詢?nèi)蝿?wù)給驅(qū)動(dòng)程序。(2)GetPlan編譯器獲得該用戶的任務(wù)Plan,對(duì)查詢進(jìn)行分析。(3)GetMetaData編譯器根據(jù)用戶任務(wù)發(fā)送元數(shù)據(jù)請(qǐng)求到元數(shù)據(jù)庫(kù),去獲取需要的Hive的元數(shù)據(jù)信息。(4)SendMetaData元數(shù)據(jù)庫(kù)發(fā)送元數(shù)據(jù)給編譯器。

編譯器得到元數(shù)據(jù)信息后,對(duì)任務(wù)進(jìn)行編譯。

先將HiveQL轉(zhuǎn)換為抽象語(yǔ)法樹(shù),進(jìn)而轉(zhuǎn)換成查詢塊,然后將查詢塊轉(zhuǎn)化為邏輯查詢計(jì)劃,并重寫(xiě)邏輯查詢計(jì)劃,將其轉(zhuǎn)換為物理計(jì)劃,最后進(jìn)行調(diào)優(yōu),選擇最佳的策略。(5)SendPlan編譯器重新發(fā)送計(jì)劃給驅(qū)動(dòng)程序。

到此為止,查詢分析和編譯完成。(6)ExecutePlan驅(qū)動(dòng)程序發(fā)送執(zhí)行計(jì)劃到執(zhí)行引擎。

7.1Hive基礎(chǔ)7.1.4Hive工作原理(7)ExecuteJob在Hive內(nèi)部,執(zhí)行作業(yè)的過(guò)程實(shí)際上是一個(gè)MapReduce工作。執(zhí)行引擎發(fā)送作業(yè)給JobTracker,NameNode

將作業(yè)分配給數(shù)據(jù)節(jié)點(diǎn)的TaskTracker,執(zhí)行Map和Reduce工作。任務(wù)會(huì)直接讀取HDFS中的文件進(jìn)行相應(yīng)的操作。(8)MetaDataOps執(zhí)行引擎可以通過(guò)MetaStore執(zhí)行元數(shù)據(jù)操作,這里的操作與第(7)步驟同時(shí)執(zhí)行。(9)FetchResults執(zhí)行引擎接收來(lái)自數(shù)據(jù)節(jié)點(diǎn)的結(jié)果。(10)SendResults執(zhí)行引擎發(fā)送結(jié)果給驅(qū)動(dòng)程序。(11)SendResults驅(qū)動(dòng)程序?qū)⒔Y(jié)果返回給用戶。

7.1Hive基礎(chǔ)7.1.5 Hive內(nèi)置數(shù)據(jù)類型表7.1Hive基礎(chǔ)數(shù)據(jù)類型數(shù)據(jù)類型長(zhǎng)度描述TINYINT1字節(jié)(8位)有符號(hào)整型SMALLINT2字節(jié)(16位)有符號(hào)整型INT4字節(jié)(32位)有符號(hào)整型BIGINT8字節(jié)(64位)有符號(hào)整型FLOAT4字節(jié)(32位)有符號(hào)單精度浮點(diǎn)數(shù)DOUBLE8字節(jié)(64位)有符號(hào)雙精度浮點(diǎn)數(shù)DECIMAL-可帶小數(shù)的精確數(shù)字字符串BOOLEAN-布爾類型TRUE/FALSEBINARY-字節(jié)序列STRING-字符串CHAR最大的字符數(shù):255長(zhǎng)度固定字符串VARCHAR字符數(shù)范圍:1~65535長(zhǎng)度不定字符串TIMESTAMP-時(shí)間戳,它支持傳統(tǒng)的UNIX時(shí)間戳可選納秒的精度DATE-日期,格式:YYYY-MM-DD

7.1Hive基礎(chǔ)7.1.5 Hive內(nèi)置數(shù)據(jù)類型表7.2Hive復(fù)雜數(shù)據(jù)類型數(shù)據(jù)類型描述ARRAY由一系列相同數(shù)據(jù)類型的元素組成,可通過(guò)下標(biāo)訪問(wèn)這些元素,且下標(biāo)從0開(kāi)始MAP由一組無(wú)序的鍵值對(duì)組成,可通過(guò)鍵來(lái)訪問(wèn)元素。鍵的類型必須是原子的,值可以是任何類型STRUCT可以包含不同數(shù)據(jù)類型的元素,通過(guò)“點(diǎn)語(yǔ)法”的方式來(lái)訪問(wèn)元素UNION聯(lián)合體,是異類的數(shù)據(jù)類型的集合,從Hive0.7.0開(kāi)始支持。元素共享內(nèi)存,同一時(shí)刻同一地點(diǎn)只有聯(lián)合體中的一個(gè)元素生效

7.1Hive基礎(chǔ)7.1.6 Hive數(shù)據(jù)模型Hive的數(shù)據(jù)存儲(chǔ)是基于HDFS的,它沒(méi)有專門(mén)的存儲(chǔ)格式,在默認(rèn)情況下,Hive使用制表符來(lái)分割列與列之間的間隔,用戶也可以在創(chuàng)建表時(shí)自由指定數(shù)據(jù)中的列分隔符和行分隔符。Hive的數(shù)據(jù)模型主要有:數(shù)據(jù)庫(kù)(Database)、表(Table)、分區(qū)(Partition)

和桶(Bucket)。

7.1Hive基礎(chǔ)7.1.6 Hive數(shù)據(jù)模型(1)數(shù)據(jù)庫(kù)(Database)Hive中的數(shù)據(jù)庫(kù)相當(dāng)于關(guān)系型數(shù)據(jù)庫(kù)中的命名空間,作用是將數(shù)據(jù)庫(kù)應(yīng)用隔離到不同的數(shù)據(jù)庫(kù)模式中,在HDFS中表現(xiàn)為“﹩{hive.metastore.warehouse.dir}”目錄下的一個(gè)文件夾。(2)表(Table)Hive中的表本質(zhì)上是Hadoop文件系統(tǒng)中的目錄或文件,在默認(rèn)情況下,表的存放路徑位于數(shù)據(jù)庫(kù)目錄下,按表名進(jìn)行文件夾區(qū)分。表可以過(guò)濾、投影、連接和聯(lián)合。

7.1Hive基礎(chǔ)7.1.6 Hive數(shù)據(jù)模型Hive常見(jiàn)的數(shù)據(jù)表的類型有內(nèi)部表、外部表、分區(qū)表和桶表。1)內(nèi)部表內(nèi)部表(ManagerTable)也稱為“管理表”,其數(shù)據(jù)由Hive自身管理,是Hive默認(rèn)的表類型。內(nèi)部表的數(shù)據(jù)會(huì)存放在HDFS的特定位置中,一般在Hive的數(shù)據(jù)庫(kù)目錄下。當(dāng)刪除內(nèi)部表時(shí),Hive將刪除表中的數(shù)據(jù)和元數(shù)據(jù)。2)外部表外部表(ExternalTable)使用external修飾,其數(shù)據(jù)由HDFS管理,數(shù)據(jù)的存放位置可以由用戶任意指定。外部表的數(shù)據(jù)除了Hive外,其他的工具(如Pig)也可以使用。創(chuàng)建外部表時(shí),Hive僅記錄數(shù)據(jù)所在的路徑,不對(duì)數(shù)據(jù)的位置作任何改變。刪除外部表時(shí),Hive只刪除表的元數(shù)據(jù),表中的數(shù)據(jù)并未刪除。因此,相對(duì)來(lái)說(shuō),外部表較內(nèi)部表安全,數(shù)據(jù)組織更加靈活,方便數(shù)據(jù)共享。

7.1Hive基礎(chǔ)7.1.6 Hive數(shù)據(jù)模型3)分區(qū)表分區(qū)表(PartitionTable)的存放路徑在HDFS中表現(xiàn)為表目錄下的子目錄,該子目錄以分區(qū)值命名。分區(qū)表就是將表進(jìn)行水平切分,將表數(shù)據(jù)按照某種規(guī)則存儲(chǔ),以提高查詢效率。4)桶表桶表(BucketTable)是同一個(gè)表目錄下根據(jù)Hash散列之后的多個(gè)文件。在處理大規(guī)模數(shù)據(jù)集時(shí),如果分區(qū)不能更細(xì)粒度地劃分?jǐn)?shù)據(jù),可以采用分桶技術(shù)來(lái)更細(xì)粒度地劃分和管理數(shù)據(jù),一般用于高效率的數(shù)據(jù)采樣。

7.1Hive基礎(chǔ)7.1.6 Hive數(shù)據(jù)模型(3)分區(qū)(Partition)在大數(shù)據(jù)應(yīng)用中進(jìn)行全表掃描非常耗費(fèi)資源,Hive可以為頻繁使用的數(shù)據(jù)建立分區(qū),分區(qū)是表的部分列的集合。這樣查找分區(qū)中的數(shù)據(jù)時(shí)就不需要掃描全表,就能極大地提高查找效率。例如,一個(gè)表里存儲(chǔ)了一年的數(shù)據(jù),但很多時(shí)候只想查詢其中一天的數(shù)據(jù),而為了這一天的數(shù)據(jù)去掃描全表是相當(dāng)不劃算的操作。因此,建表時(shí)可以指定按天分區(qū),這樣在后續(xù)應(yīng)用中可以按分區(qū)查找,以提高效率。在實(shí)際生產(chǎn)環(huán)境中,由于業(yè)務(wù)數(shù)據(jù)量較大,一般都會(huì)對(duì)表進(jìn)行分區(qū)。

7.1Hive基礎(chǔ)7.1.6 Hive數(shù)據(jù)模型(4)桶(Bucket)桶(Bucket)是通過(guò)對(duì)指定列進(jìn)行Hash計(jì)算來(lái)實(shí)現(xiàn)的,通過(guò)哈希值來(lái)進(jìn)行數(shù)據(jù)切分,每個(gè)桶對(duì)應(yīng)于該列下的一個(gè)存儲(chǔ)文件。分區(qū)和分桶最大的區(qū)別:分桶是隨機(jī)分割數(shù)據(jù),而分區(qū)并非隨機(jī)分割;分桶存儲(chǔ)在文件中,而分區(qū)存放在文件夾中。

7.2 Hive的安裝部署Hive是一個(gè)客戶端工具,沒(méi)有集群的概念,因此,無(wú)須每臺(tái)機(jī)器都安裝,哪個(gè)節(jié)點(diǎn)需要就安裝在哪個(gè)節(jié)點(diǎn)上。Hive會(huì)選擇一些第三方數(shù)據(jù)庫(kù)(如MySQL、Derby等),存放Hive的元數(shù)據(jù)信息。本章選用MySQL來(lái)存儲(chǔ)Hive元數(shù)據(jù),在安裝Hive客戶端前,需要先安裝MySQL數(shù)據(jù)庫(kù)。安裝MySQL本章使用的MySQL版本是MySQL5.7。以下操作均使用root賬戶。①檢查MySQL是否安裝“yumlistinstall|grepmysql”。

如果已經(jīng)安裝了MySQL,但是版本并不是所需要的,可以先全部卸載:“yum-yremove+數(shù)據(jù)庫(kù)名稱”。②下載MySQL源安裝包。將MySQL源進(jìn)行安裝:“yumlocalinstallmysql57-community-re-alease-el7-8.noarch.rpm”。mysql源安裝完成后,需要檢查是否安裝成功:yumrepolistenabled|grep"mysql.?-community.?",如圖7.3所示即為安裝成功。圖7.3mysql源安裝結(jié)果

7.2 Hive的安裝部署③安裝MySQL服務(wù):yuminstallmysql-community-server。④啟動(dòng)MySQL服務(wù)并設(shè)置開(kāi)機(jī)自啟動(dòng)。systemctlstartmysqldsystemctlenablemysqldsystemctldaemon-reload查看MySQL服務(wù)狀態(tài):systemctlstatusmysqld,如圖7.4所示,MySQL服務(wù)為運(yùn)行狀態(tài)。圖7.4查看MySQL服務(wù)狀態(tài)

7.2 Hive的安裝部署⑤設(shè)置MySQLroot用戶密碼。在默認(rèn)情況下,root用戶沒(méi)有密碼。為了安全性考慮,還需要設(shè)置root用戶密碼。首先使用命令“grep'temporarypassword'/var/log/mysqld.log”查看MySQLroot用戶的臨時(shí)密碼。如圖7.5所示,MySQLroot用戶的臨時(shí)密碼為“e<?n<GuD3opt”。7.5查看MySQL的臨時(shí)密碼

7.2 Hive的安裝部署⑥創(chuàng)建MySQLHive賬戶。登錄MySQL后輸入命令“createuser‘hive’identifiedby‘Hive@123’;”來(lái)創(chuàng)建Hive賬戶。并將MySQL所有權(quán)限授予Hive賬戶,命令為“grantallon?.?to‘hive’@‘masteridentifiedby’Hive@123‘;”。最后使用命令“flushprivileges;”使前邊的命令生效??稍贛ySQL命令行中輸入命令“selecthost,userfrommysql.user;”,查看是否有Hive用戶。⑦創(chuàng)建數(shù)據(jù)庫(kù)。使用Hive賬戶登錄MySQL,命令為“mysql-hmaster-uhive-pHive@123;”,其中master為主機(jī)名稱。執(zhí)行命令“createdatabasehivedb;”,創(chuàng)建名為“hivedb”的數(shù)據(jù)庫(kù)??赏ㄟ^(guò)“showdatabases;”命令查看“hivedb”數(shù)據(jù)庫(kù)是否創(chuàng)建成功。⑧使用“quit;”命令退出MySQL。至此,MySQL安裝配置完成。

7.2 Hive的安裝部署1)下載并解壓Hive在網(wǎng)上下載Hive安裝包“apache-hive-1.2.2-bin.tar.gz”,并將其上傳至master節(jié)點(diǎn)的“/home/apache/package”目錄下,并在該目錄下使用解壓命令解壓Hive至“/home/apache/soft”目錄:“tar-zxvfapache-hive-1.2.2-bin.tar.gz-C/home/apache/soft”。

修改解壓包名稱“mvapache-hive-1.2.2-binhive-1.2.2”。2)修改配置文件hive-site.xml默認(rèn)情況下hive-site.xml并不存在,需要先復(fù)制一個(gè)。

進(jìn)入Hive安裝目錄“/home/a-pache/soft/hive-1.2.2/conf”,復(fù)制“hive-site.xml”文件“cphive-default.xml.templatehive-site.xml”。

編輯“hive-site.xml”文件:“vihive-site.xml”。(2)安裝Hive

7.2 Hive的安裝部署①在Linux命令輸入模式下輸入“/javax.jdo.option.ConnectionDriverName”搜索“javax.jdo.option.ConnectionDriverName”屬性,將其修改為“com.mysql.jdbc.Driver”。②修改屬性“javax.jdo.option.ConnectionURL”,將連接MySQL的url修改為“jdbc:mysql://master:3306/hivedb?characterEncoding=UTF-8”。③修改連接數(shù)據(jù)庫(kù)的用戶名和密碼。連接用戶名為“hive”,密碼為“Hive@123”。(2)安裝Hive

7.2 Hive的安裝部署④修改Hive數(shù)據(jù)目錄。新建目錄“mkdir-p/home/apache/data/hive/io”,用于存放Hive的數(shù)據(jù)。修改“hive-site.xml”中的內(nèi)容如下:(2)安裝Hive<property><name>hive.querylog.location</name><value>/home/apache/data/hive/io</value><description>LocationofHiveruntimestructuredlogfile</description></property><property><name>hive.exec.local.scratchdir</name><value>/home/apache/data/hive/io</value><description>LocalscratchspaceforHivejobs</description></property><property><name>hive.downloaded.resources.dir</name><value>/home/apache/data/hive/io</value><description>Temporarylocaldirectoryforaddedresourcesintheremotefilesystem.</description></property>

7.2 Hive的安裝部署下載MySQL驅(qū)動(dòng)包“mysql-connector-java-5.1.38.jar”,將其上傳到Hive的lib目錄下。如果不添加驅(qū)動(dòng)包,執(zhí)行初始化時(shí)會(huì)拋出異常。(3)添加MySQL驅(qū)動(dòng)包(4)配置Hive環(huán)境變量切換到root用戶,打開(kāi)“vi/etc/profile”文件,添加Hive相關(guān)的環(huán)境變量,如圖7.6所示。保存并退出后,執(zhí)行命令“source/etc/profile”,使配置文件生效。圖7.6配置Hive環(huán)境變量(5)啟動(dòng)Hive首先啟動(dòng)Hadoop集群,然后直接在終端輸入“hive”命令,即可啟動(dòng)Hive。

7.3 Hive基本操作7.3.1數(shù)據(jù)庫(kù)相關(guān)操作Hive數(shù)據(jù)庫(kù)是用來(lái)組織數(shù)據(jù)表的,本質(zhì)上是數(shù)據(jù)倉(cāng)庫(kù)下的一個(gè)目錄。創(chuàng)建數(shù)據(jù)庫(kù)的語(yǔ)法為“createdatabase[ifnotexists]database_name;”。其中“[ifnotex-ists]”是可選的,如果使用了,表示只有當(dāng)數(shù)據(jù)庫(kù)不存在時(shí)才進(jìn)行創(chuàng)建,如果有同名數(shù)據(jù)庫(kù)存在,則不執(zhí)行該創(chuàng)建數(shù)據(jù)庫(kù)的命令。例如,創(chuàng)建一個(gè)名為“apachedb”的數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)創(chuàng)建完成后,可以在HDFS中查看到它的存儲(chǔ)位置。默認(rèn)存儲(chǔ)在“/user/hive/warehouse”目錄下,如圖7.7所示。(1)創(chuàng)建數(shù)據(jù)庫(kù)圖7.7HDFS中對(duì)應(yīng)數(shù)據(jù)庫(kù)所在目錄

7.3 Hive基本操作7.3.1數(shù)據(jù)庫(kù)相關(guān)操作使用命令“showdatabases;”可查看創(chuàng)建的所有數(shù)據(jù)庫(kù)。如果想要查看某一個(gè)數(shù)據(jù)庫(kù)的詳細(xì)信息,可使用關(guān)鍵字describe,具體的命令為“describedatabasedatabase_name;”,如圖7.8所示。(2)查看數(shù)據(jù)庫(kù)圖7.8查看數(shù)據(jù)庫(kù)信息

7.3 Hive基本操作7.3.1數(shù)據(jù)庫(kù)相關(guān)操作Hive默認(rèn)情況下當(dāng)前的數(shù)據(jù)庫(kù)是default,如果想使用其他的數(shù)據(jù)庫(kù),可使用use關(guān)鍵字進(jìn)行切換。例如,要切換到apachedb

數(shù)據(jù)庫(kù),使用的命令為“useapachedb;”。為了方便查看目前正在使用的數(shù)據(jù)庫(kù)是哪一個(gè),可以在Hive的安裝目錄的bin目錄下創(chuàng)建隱藏文件“.hiv-erc”,并在該文件中輸入“sethive.cli.print.current.db=true;”。這樣就可以在Hive的命令提示符中顯示當(dāng)前的數(shù)據(jù)庫(kù)名稱。(3)切換數(shù)據(jù)庫(kù)

7.3 Hive基本操作7.3.1數(shù)據(jù)庫(kù)相關(guān)操作可使用“drop”關(guān)鍵字刪除數(shù)據(jù)庫(kù),語(yǔ)法為“dropdatabase[ifexists]database_name;”。例如,刪除數(shù)據(jù)庫(kù)apachedb,如圖7.10所示。(4)刪除數(shù)據(jù)庫(kù)圖7.8刪除數(shù)據(jù)庫(kù)apachedb

7.3 Hive基本操作7.3.2數(shù)據(jù)表相關(guān)操作數(shù)據(jù)表包括內(nèi)部表、外部表、分區(qū)表和桶表,它們有不同的特征。創(chuàng)建表有兩種不同的方式:按照數(shù)據(jù)目錄,可以創(chuàng)建內(nèi)部表和外部表;按照數(shù)據(jù)的管理方式,可以創(chuàng)建分區(qū)表和桶表。創(chuàng)建表的語(yǔ)法格式為:(1)創(chuàng)建表create[external]table[ifnotexists]table_name(column1data_type[comment'字段注釋'],column2data_type[comment'字段注釋'],...)[comment'表注釋'][partitionedby(columndata_type,...)][clusteredby(column1,column2,...)][rowformatdelimitedfieldsterminatedby'\t'linesterminatedby'\n'storedastextfile][location'表的存儲(chǔ)目錄'][asselect_statement][likeexisting_table]

7.3 Hive基本操作7.3.2數(shù)據(jù)表相關(guān)操作①external關(guān)鍵字用于指定創(chuàng)建外部表,若未指定,默認(rèn)是創(chuàng)建內(nèi)部表。②可以使用comment關(guān)鍵字對(duì)表的字段和表添加注釋。③partitionedby(columndata_type,…):用于創(chuàng)建分區(qū)表,指定分區(qū)的字段,且partitioned里的字段不能是表中聲明的字段,必須是一個(gè)新字段。④clusteredby(column1,column2,…):用于創(chuàng)建桶表,指定按照哪些字段進(jìn)行分桶。clustered里的字段必須要是表字段中出現(xiàn)的字段。⑤rowformatdelimited:用于指定行列的數(shù)據(jù)格式或分隔符,例如,可以指定字段間使用“\t”間隔,行間使用“\n”分隔。使用storedas指定文件的存儲(chǔ)格式,默認(rèn)為textfile。⑥location:創(chuàng)建外部表時(shí)需要使用location來(lái)指定表的存儲(chǔ)位置,且location的位置必須是目錄,不能是單個(gè)文件。⑦asselect_statement:查詢建表法,通過(guò)復(fù)制另一張表的結(jié)構(gòu)和表中所有數(shù)據(jù)來(lái)創(chuàng)建新表。⑧l(xiāng)ikeexisting_table:通過(guò)復(fù)制另一張表的結(jié)構(gòu)來(lái)建表,不復(fù)制表中的數(shù)據(jù)。(1)創(chuàng)建表

7.3 Hive基本操作7.3.2數(shù)據(jù)表相關(guān)操作例如,分別用不同的方式創(chuàng)建一個(gè)員工表。1)創(chuàng)建內(nèi)部表可按如下方式創(chuàng)建內(nèi)部表“employee”,包括屬性id(int類型)、name(string類型)、sex(string類型)、age(int類型)、department(string類型)。字段之間使用“,”號(hào)進(jìn)行分隔,行之間使用“\n”分隔。(1)創(chuàng)建表createtableifnotexistsemployee(idintcomment'employeeid',namestringcomment'employeename',sexstring,age

int,departmentstring)rowformatdelimitedfieldsterminatedby','linesterminatedby'\n';

7.3 Hive基本操作7.3.2數(shù)據(jù)表相關(guān)操作創(chuàng)建外部表創(chuàng)建外部表需要指定關(guān)鍵字“external”,一般還需要指定一個(gè)外部路徑,默認(rèn)的路徑是“/user/hive/warehouse/apachedb.db”下的以表名命名的目錄。具體命令為:需要先創(chuàng)建好數(shù)據(jù)存儲(chǔ)目錄“/home/apache/data/hive/extbdata”。(1)創(chuàng)建表createexternaltableifnotexistsemployee_external(idintcomment'employeeid',namestringcomment'employeename',sexstring,age

int,departmentstring)rowformatdelimitedfieldsterminatedby','linesterminatedby'\n'location'/home/apache/data/hive/extbdata';

7.3 Hive基本操作7.3.2數(shù)據(jù)表相關(guān)操作3)創(chuàng)建分區(qū)表創(chuàng)建一個(gè)分區(qū)表“employee_partition”,以city進(jìn)行分區(qū)。(1)創(chuàng)建表createtableifnotexistsemployee_partition(idintcomment'employeeid',namestringcomment'employeename',sexstring,age

int,departmentstring)partitionedby(citystring)rowformatdelimitedfieldsterminatedby','linesterminatedby'\n';

7.3 Hive基本操作7.3.2數(shù)據(jù)表相關(guān)操作4)創(chuàng)建桶表在創(chuàng)建桶表之前,需要先設(shè)置“sethive.enforce.bucketing=true”開(kāi)啟分桶功能,然后才能創(chuàng)建桶表。例如,將employee表按照id字段劃分為4個(gè)桶。(1)創(chuàng)建表createtableifnotexistsemployee_bucket(idintcomment'employeeid',namestringcomment'employeename',sexstring,age

int,departmentstring)clusteredby(id)into4bucketsrowformatdelimitedfieldsterminatedby',';

7.3 Hive基本操作7.3.2數(shù)據(jù)表相關(guān)操作使用“showtables;”命令可查看數(shù)據(jù)庫(kù)里面的所有表。如圖7.11所示,可以看到數(shù)據(jù)庫(kù)apachedb

中有剛剛創(chuàng)建的4個(gè)表。(2)查看表圖7.11查看數(shù)據(jù)庫(kù)中的表

7.3 Hive基本操作7.3.2數(shù)據(jù)表相關(guān)操作使用關(guān)鍵字“desc”可查看某個(gè)表的字段信息。例如,查看employee表的結(jié)構(gòu)信息如圖7.12所示。再加上關(guān)鍵字“formatted”,可以查看更詳細(xì)的表信息。如圖7.13顯示的是查看“employee_external”的詳細(xì)信息。(2)查看表圖7.12查看employee表結(jié)構(gòu)信息圖7.13查看employee_external詳情

7.3 Hive基本操作7.3.2數(shù)據(jù)表相關(guān)操作可以使用“altertable”命令來(lái)修改表的屬性,該命令只是修改表的元數(shù)據(jù),表中的數(shù)據(jù)不受影響。因此,需要保證表中的數(shù)據(jù)要與修改后的元數(shù)據(jù)模式匹配,否則原始表中的數(shù)據(jù)將變得不可用。(3)修改表1)修改表的名稱語(yǔ)法為“altertabletable_namerenametonew_table_name;”。例如,將employee表的名稱改為“employee2”。例如,將employee表的名稱改為employee2。altertableemployeerenametoemployee2;

7.3 Hive基本操作7.3.2數(shù)據(jù)表相關(guān)操作(3)修改表2)修改表字段的定義①增加列使用addcolumns可以為表增加一個(gè)或多個(gè)列。例如,為employee2表增加string類型的province列和bigint類型的salary列,如圖7.14所示。新添加的列位于該表的最后。圖7.14增加新列

7.3 Hive基本操作7.3.2數(shù)據(jù)表相關(guān)操作(3)修改表2)修改表字段的定義②修改列定義使用change可以修改列名稱、列注釋、列類型和列的位置。例如,將employee2表的“id”字段重命名為“uid”,注釋修改為“theuniqueid”,且將位置放在name之后。如圖7.15所示。圖7.15修改id字段信息

7.3 Hive基本操作7.3.2數(shù)據(jù)表相關(guān)操作(3)修改表2)修改表字段的定義③替換字段使用

replace將表中的所有字段替換成新的字段,相當(dāng)于將整個(gè)表結(jié)構(gòu)進(jìn)行了重置。例如,將employee2表中的字段替換為id(int類型)、name(string類型)和department(string類型)。如圖7.16所示。圖7.16替換字段

7.3 Hive基本操作7.3.2數(shù)據(jù)表相關(guān)操作(3)修改表3)對(duì)分區(qū)表的分區(qū)進(jìn)行操作為了方便進(jìn)行測(cè)試,先使用like命令將“employee_partition”表復(fù)制一個(gè)新的分區(qū)表“employee_partition2”。createtableemployee_partition2likeemployee_partition;①增加分區(qū)在“employee_partiton2”表中增加city為beijing和tianjin兩個(gè)分區(qū)。altertableemployee_partition2addpartition(city='beijing')partition(city='tianjin');

7.3 Hive基本操作7.3.2數(shù)據(jù)表相關(guān)操作(3)修改表可使用“showpartitions”命令查看分區(qū)情況,如圖7.17所示。圖7.17查看分區(qū)分區(qū)對(duì)應(yīng)在HDFS上表現(xiàn)為數(shù)據(jù)存儲(chǔ)目錄,如圖7.18所示。“employee_partition2”數(shù)據(jù)表目錄下新增“city=beijing”和“city=tianjian”兩個(gè)目錄。圖7.18新增分區(qū)

7.3 Hive基本操作7.3.2數(shù)據(jù)表相關(guān)操作(3)修改表②刪除分區(qū)刪除“employee_partition2”表中的分區(qū)“city='beijing'”和“city='tianjin'”。如圖7.19所示。刪除分區(qū)并沒(méi)有刪除HDFS上對(duì)應(yīng)的目錄,刪除分區(qū)只是刪除了元數(shù)據(jù),對(duì)實(shí)際數(shù)據(jù)沒(méi)有影響。圖7.19刪除分區(qū)

7.3 Hive基本操作7.3.2數(shù)據(jù)表相關(guān)操作(4)刪除表使用drop命令可以刪除表,例如,“droptableemployee;”命令可刪除employee表。

7.3 Hive基本操作7.3.3數(shù)據(jù)的導(dǎo)入導(dǎo)出(1)數(shù)據(jù)導(dǎo)入Hive可以使用load、insert等操作命令來(lái)向表中裝載數(shù)據(jù),也可以使用insert子句將數(shù)據(jù)導(dǎo)出到HDFS。1)使用load方式導(dǎo)入數(shù)據(jù)load命令可以一次性向表中導(dǎo)入大量的數(shù)據(jù),語(yǔ)法格式為:“l(fā)oaddata[local]inpath'數(shù)據(jù)文件目錄’[overwrite]intotabletable_name[partiton(分區(qū)值)];”。關(guān)鍵字local用于確定導(dǎo)入的文件是位于本地路徑還是HDFS目錄。加上local關(guān)鍵字,表示將本地文件復(fù)制并上傳到HDFS指定目錄。不加local,Hive

則是將HDFS上的數(shù)據(jù)移動(dòng)到指定目錄(而不是復(fù)制)。無(wú)論是本地的數(shù)據(jù)還是HDFS上的數(shù)據(jù),都可以使用相對(duì)路徑和絕對(duì)路徑這兩種方式進(jìn)行導(dǎo)入。

7.3 Hive基本操作7.3.3數(shù)據(jù)的導(dǎo)入導(dǎo)出(1)數(shù)據(jù)導(dǎo)入①導(dǎo)入本地?cái)?shù)據(jù)在本地“/home/apache/data/hive/data”目錄下新建文件“employeeinfo1.txt”,內(nèi)容如下:101,wanglan,male,23,marketing102,zhaojuan,femal,32,marketing103,yangran,femal,25,software104,lixiao,male,45,administration105,heyun,male,22,software106,zhouyang,male,30,software

7.3 Hive基本操作7.3.3數(shù)據(jù)的導(dǎo)入導(dǎo)出(1)數(shù)據(jù)導(dǎo)入將“/home/apache/data/hive/data”目錄中的文件導(dǎo)入到內(nèi)部表employee中:loaddatalocalinpath'/home/apache/data/hive/data/'intotableemployee;如果employee表中已有記錄,但想將這些記錄覆蓋掉,可以加上overwrite關(guān)鍵字,命令為:loaddatalocalinpath'/home/apache/data/hive/data/'overwriteintotableemployee;如果是將數(shù)據(jù)導(dǎo)入到分區(qū)表,則需要在命令中指定分區(qū)值。例如,將“/home/apache/data/hive/data”目錄下的文件導(dǎo)入到分區(qū)表“employee_partition”中,指定分區(qū)值為beijing。loaddatalocalinpath'/home/apache/data/hive/data/'intotableemployee_partitionpartition(city='beijing');

7.3 Hive基本操作7.3.3數(shù)據(jù)的導(dǎo)入導(dǎo)出(1)數(shù)據(jù)導(dǎo)入執(zhí)行完上述命令語(yǔ)句后,“employeeinfo1.txt”文件中的數(shù)據(jù)全部導(dǎo)入“employee_partition”表的beijing分區(qū)中。在HDFS上可以看到,在“employee_partition”目錄下有一個(gè)“city=beijing”的目錄,里面存在文件“employeeinfo1.txt”,如圖7.20所示。圖7.20導(dǎo)入數(shù)據(jù)到分區(qū)表

7.3 Hive基本操作7.3.3數(shù)據(jù)的導(dǎo)入導(dǎo)出(1)數(shù)據(jù)導(dǎo)入②導(dǎo)入HDFS上的數(shù)據(jù)不加local關(guān)鍵字可以導(dǎo)入HDFS上的數(shù)據(jù)。這里先通過(guò)復(fù)制employee表來(lái)創(chuàng)建新表“employee_copy”,通過(guò)復(fù)制“employee_partition”來(lái)創(chuàng)建新的分區(qū)表“employee_partition3”。然后將“employeeinfo1.txt”文件上傳到HDFS:“hdfsdfs-put/home/apache/data/hive/data/employeeinfo1.txt/hdfstest”。將HDFS中“/hdfstest”目錄下的employeeinfo1.txt導(dǎo)入到employee_copy表中。loaddatainpath'/hdfstest/employeeinfo1.txt'intotableemployee_copy;

7.3 Hive基本操作7.3.3數(shù)據(jù)的導(dǎo)入導(dǎo)出(1)數(shù)據(jù)導(dǎo)入命令執(zhí)行完后,“employeeinfo1.txt”由“/hdfstest”目錄移動(dòng)到“/user/hive/warehouse/apachedb.db/employee_copy”目錄下。此時(shí),進(jìn)行“employee_partition3”數(shù)據(jù)表導(dǎo)入前,需要將本地的“employeeinfo1.txt”文件再次上傳到HDFS的“/hdfstest”目錄,然后才能執(zhí)行導(dǎo)入命令。loaddatainpath'/hdfstest/employeeinfo1.txt'intotableemployee_partition3partition(city='beijing');執(zhí)行完后,文件由“/hdfstest”目錄移動(dòng)到“/user/hive/warehouse/apachedb.db/employee_partition3/city=beijing”目錄中。

7.3 Hive基本操作7.3.3數(shù)據(jù)的導(dǎo)入導(dǎo)出(1)數(shù)據(jù)導(dǎo)入2)使用insert方式導(dǎo)入數(shù)據(jù)Hive可利用insert關(guān)鍵字向表中插入數(shù)據(jù),語(yǔ)法格式為:“insertintotabletable_name[partition(分區(qū)值)]values(值1,值2,…);”。也可以結(jié)合select子句構(gòu)成查詢插入方式,語(yǔ)法為:“insertintotabletable_name[partition(分區(qū)值)]select子句;”。這種方式實(shí)際上是將insert語(yǔ)句轉(zhuǎn)換成MapReduce任務(wù)來(lái)執(zhí)行。例如,往employee表中插入一條數(shù)據(jù)。insertintotableemployeevalues(107,'qianming','male',29,'software');

7.3 Hive基本操作7.3.3數(shù)據(jù)的導(dǎo)入導(dǎo)出(1)數(shù)據(jù)導(dǎo)入如果是分區(qū)表,則必須指定分區(qū)。例如,向分區(qū)表“employee_partition”中插入一條數(shù)據(jù)。insertintotableemployee_partitionpartition(city='beijing')values(107,'qianming','male',29,'software');結(jié)合select子句進(jìn)行查詢就是將select查詢的結(jié)果插入到insert語(yǔ)句中的表中,select查詢的所有字段都必須在insert后面的表中定義,且字段的格式需要一致。其示例如下:insertintotableemployee_copyselectid,name,sex,age,departmentfromemployee;

7.3 Hive基本操作7.3.3數(shù)據(jù)的導(dǎo)入導(dǎo)出(1)數(shù)據(jù)導(dǎo)入使用select子句可實(shí)現(xiàn)一次查詢多次插入,這種方式可以減少查詢操作掃描數(shù)據(jù)的次數(shù),從而提高SQL語(yǔ)句的執(zhí)行效率。先通過(guò)“employee_partition”表復(fù)制出三個(gè)結(jié)構(gòu)相同的表,如圖7.21所示。使用只查詢一次的方式向這三個(gè)分區(qū)表插入數(shù)據(jù),如圖7.22所示。其中,employee_ptn2表在插入的過(guò)程中使用overwrite關(guān)鍵字實(shí)現(xiàn)數(shù)據(jù)覆蓋。數(shù)據(jù)插入成功后,在HDFS中數(shù)據(jù)表目錄下有一個(gè)“city=beijing”的目錄,里面有一個(gè)名稱為“000000_0”文件,這個(gè)就是數(shù)據(jù)表文件??梢允褂胐fs命令查看文件內(nèi)容,如圖7.23所示。

7.3 Hive基本操作7.3.3數(shù)據(jù)的導(dǎo)入導(dǎo)出(1)數(shù)據(jù)導(dǎo)入圖7.21創(chuàng)建3個(gè)分區(qū)表圖7.22使用insert實(shí)現(xiàn)查詢一次多次插入圖7.21使用dfs命令查看數(shù)據(jù)表文件內(nèi)容

7.3 Hive基本操作7.3.3數(shù)據(jù)的導(dǎo)入導(dǎo)出(1)數(shù)據(jù)導(dǎo)入3)動(dòng)態(tài)分區(qū)插入數(shù)據(jù)前面對(duì)分區(qū)表插入數(shù)據(jù)用的都是靜態(tài)分區(qū)插入的方式,也就是手動(dòng)指定分區(qū)。Hive也支持動(dòng)態(tài)分區(qū)插入數(shù)據(jù),即通過(guò)查詢出來(lái)的分區(qū)字段的值來(lái)進(jìn)行自動(dòng)判斷,從而創(chuàng)建出需要的分區(qū),每一個(gè)不同分區(qū)值就會(huì)創(chuàng)建一個(gè)對(duì)應(yīng)的分區(qū)。在默認(rèn)情況下,Hive并沒(méi)有開(kāi)啟動(dòng)態(tài)分區(qū)功能,需要手動(dòng)開(kāi)啟。在Hive命令行下輸入以下兩條命令:第一條是打開(kāi)動(dòng)態(tài)分區(qū)的開(kāi)關(guān),第二條是設(shè)置動(dòng)態(tài)分區(qū)插入模式。sethive.exec.dynamic.partition=true;sethive.exec.dynamic.partition.mode=nonstrict;

7.3 Hive基本操作7.3.3數(shù)據(jù)的導(dǎo)入導(dǎo)出(1)數(shù)據(jù)導(dǎo)入設(shè)置好參數(shù)后,就可以利用動(dòng)態(tài)分區(qū)往表中插入數(shù)據(jù)。創(chuàng)建表“employee_ptn4”,通過(guò)department字段分區(qū)。圖7.24利用動(dòng)態(tài)分區(qū)插入數(shù)據(jù)結(jié)果

7.3 Hive基本操作7.3.3數(shù)據(jù)的導(dǎo)入導(dǎo)出(1)數(shù)據(jù)導(dǎo)入需要注意的是,動(dòng)態(tài)分區(qū)插入的分區(qū)字段必須位于select查詢語(yǔ)句中出現(xiàn)的字段的末尾。上述命令中,select子句中的字段id、name、sex和age都是分區(qū)表“employee_ptn4”的普通字段,而最后一個(gè)department則是“employee_ptn4”的分區(qū)字段。

7.3 Hive基本操作7.3.3數(shù)據(jù)的導(dǎo)入導(dǎo)出(1)數(shù)據(jù)導(dǎo)入4)通過(guò)查詢建表來(lái)加載數(shù)據(jù)Hive支持直接將查詢出來(lái)的結(jié)果存儲(chǔ)到新建的一張表里,新表的字段與查詢語(yǔ)句出現(xiàn)的字段結(jié)構(gòu)一樣。例如,使用查詢建表來(lái)創(chuàng)建一個(gè)表名為“employee_ctas”的表,并將employee表中的數(shù)據(jù)查詢出來(lái)插入到“employee_ctas”中。createtableemployee_ctasasselectid,name,sex,departmentfromemployee;圖7.25employee_ctas表結(jié)構(gòu)及表中的數(shù)據(jù)

7.3 Hive基本操作7.3.3數(shù)據(jù)的導(dǎo)入導(dǎo)出(2)清空數(shù)據(jù)表中的數(shù)據(jù)使用truncate關(guān)鍵字可以清空數(shù)據(jù)表,語(yǔ)法為:“truncatetabletable_name;”。清空內(nèi)部表、外部表和分桶表時(shí),會(huì)將數(shù)據(jù)存儲(chǔ)目錄下的所有數(shù)據(jù)文件都刪掉。而清空分區(qū)表時(shí),只會(huì)清空分區(qū)下的數(shù)據(jù)文件,不會(huì)刪掉分區(qū)。要將分區(qū)也刪除,可使用dfs

命令完成。

7.3 Hive基本操作7.3.3數(shù)據(jù)的導(dǎo)入導(dǎo)出(3)數(shù)據(jù)導(dǎo)出使用insert命令可以將數(shù)據(jù)倉(cāng)庫(kù)中的數(shù)據(jù)導(dǎo)出到本地或者HDFS中,語(yǔ)法格式為:“insertoverwrite[local]directory導(dǎo)出目錄數(shù)據(jù)分隔格式select子句;”。1)導(dǎo)出數(shù)據(jù)到本地將employee表中的字段為id、name、sex和department的數(shù)據(jù)導(dǎo)出到本地“/home/apache/data/hive/data”目錄下。insertoverwritelocaldirectory'/home/apache/data/hive/data'rowformatdelimitedfieldsterminatedby','selectid,name,sex,departmentfromemployee;

7.3 Hive基本操作7.3.3數(shù)據(jù)的導(dǎo)入導(dǎo)出(3)數(shù)據(jù)導(dǎo)出命令執(zhí)行完成后,本地“/home/apache/data/hive/data”目錄下多了一個(gè)名為“000000_0”的文件,這個(gè)就是導(dǎo)出的文件,可以使用cat命令查看其內(nèi)容,如圖7.26所示。圖7.26導(dǎo)出數(shù)據(jù)到本地

7.3 Hive基本操作7.3.3數(shù)據(jù)的導(dǎo)入導(dǎo)出(3)數(shù)據(jù)導(dǎo)出Hive也支持多模式導(dǎo)出,例如,將employee中的數(shù)據(jù)導(dǎo)出到本地“/home/apache/data/hive/data和/home/apache/data/hive/data2”目錄中。fromemployeeinsertoverwritelocaldirectiory'/home/apache/data/hive/data'rowformatdelimitedfieldsterminatedby','selectid,nameinsertoverwritelocaldirectory'/home/apache/data/hive/data2'rowformatdelimitedfieldsterminatedby','selectid,name,department;

7.3 Hive基本操作7.3.3數(shù)據(jù)的導(dǎo)入導(dǎo)出(3)數(shù)據(jù)導(dǎo)出2)導(dǎo)出數(shù)據(jù)到HDFS在HDFS上新建目錄“/user/hive/data/employee”,在終端中執(zhí)行命令:“hdfs

dfs-mkdir–p/user/hive/data/employee”。選擇employee表中的數(shù)據(jù)導(dǎo)出到HDFS的“/user/hive/data/employee”目錄。insertoverwritedirectory'/user/hive/data/employee'rowformatdelimitedfieldsterminatedby','selectid,name,departmentfromemployee;使用dfs命令查看導(dǎo)出結(jié)果,如圖7.27所示。圖7.27數(shù)據(jù)導(dǎo)出到HDFS

7.3 Hive基本操作7.3.4 Hive數(shù)據(jù)查詢語(yǔ)言(HQL)select[all|distinct]select_expr,select_expr,...fromtable_name[wherewhereCondition][groupbycolList[havinghavingCondition]][clusterbycolList|[distributebycolList][sortby|orderbycolList]][limitnumber];

7.3 Hive基本操作7.3.4 Hive數(shù)據(jù)查詢語(yǔ)言(HQL)(1)select語(yǔ)句“select…from”語(yǔ)句可實(shí)現(xiàn)從from指定的表中查詢出select指定的數(shù)據(jù)。1)全表查詢查詢出employee表的所有數(shù)據(jù),結(jié)果如圖7.28所示。圖7.28全表查詢

7.3 Hive基本操作7.3.4 Hive數(shù)據(jù)查詢語(yǔ)言(HQL)(1)select語(yǔ)句選擇特定列查詢查詢出employee表的id和name兩列信息,結(jié)果如圖7.29所示。圖7.29選擇特定列查詢

7.3 Hive基本操作7.3.4 Hive數(shù)據(jù)查詢語(yǔ)言(HQL)(1)select語(yǔ)句3)設(shè)置別名可以為列和表加上別名,尤其在多表聯(lián)合查詢時(shí),別名可以讓查詢語(yǔ)句的結(jié)構(gòu)更加清晰。例如,給employee表添加別名為“em”,查詢出id和name列。selectem.id,fromemployeeem;

7.3 Hive基本操作7.3.4 Hive數(shù)據(jù)查詢語(yǔ)言(HQL)(1)select語(yǔ)句4)limit子句可以通過(guò)limit子句來(lái)限定返回的行數(shù)。例如,如果只想獲得employee表的前三條數(shù)據(jù),可使用的語(yǔ)句為:select*fromemployeelimit3;

7.3 Hive基本操作7.3.4 Hive數(shù)據(jù)查詢語(yǔ)言(HQL)(2)where語(yǔ)句可以使用where語(yǔ)句來(lái)對(duì)查詢條件進(jìn)行限制。例如,查詢employee表中年齡大于25歲的用戶信息,如圖7.30所示。圖7.30查詢employee表中年齡大于25歲的用戶信息

7.3 Hive基本操作7.3.4 Hive數(shù)據(jù)查詢語(yǔ)言(HQL)(2)where語(yǔ)句結(jié)合謂詞表達(dá)式and,查詢employee表中department為software的男性用戶,如圖7.31所示。結(jié)合謂詞表達(dá)式or,查詢employee表中年齡大于30或者部門(mén)為administration的用戶信息,如圖7.32所示。圖7.31結(jié)合and進(jìn)行查詢圖7.32結(jié)合or進(jìn)行查詢

7.3 Hive基本操作7.3.4 Hive數(shù)據(jù)查詢語(yǔ)言(HQL)(2)where語(yǔ)句結(jié)合like子句進(jìn)行查詢,可在like子句中使用通配符“%”和占位符“_”。例如,查詢employee表中姓名中含有“yang”這個(gè)拼音的用戶信息,如圖7.33所示。在employee表的name字段中使用like子句的占位符來(lái)查詢用戶信息,如圖7.34所示。圖7.33like子句中使用通配符圖7.34like子句中使用占位符

7.3 Hive基本操作7.3.4 Hive數(shù)據(jù)查詢語(yǔ)言(HQL)(3)分組語(yǔ)句groupby和havingHive支持對(duì)結(jié)果集進(jìn)行分組。groupby語(yǔ)句的作用是按照某些字段分組,有相同字段值的放在一組,其后可以跟having語(yǔ)句用于對(duì)分組進(jìn)行條件過(guò)濾。groupby語(yǔ)句通常與聚合函數(shù)聯(lián)合使用,先按照列值對(duì)結(jié)果進(jìn)行分組,再作用聚合函數(shù)。使用groupby語(yǔ)句時(shí),select語(yǔ)句中的查詢字段要么為聚合函數(shù),要么為groupby語(yǔ)句中出現(xiàn)的用于分組的字段,不能是其他值。也就是說(shuō),select中的字段如果不是聚合列,則必須出現(xiàn)在groupby中。

7.3 Hive基本操作7.3.4 Hive數(shù)據(jù)查詢語(yǔ)言(HQL)(3)分組語(yǔ)句groupby和having例如,查詢employee表中的每個(gè)部門(mén)的人數(shù),可以按department字段分組,并使用聚合函數(shù)count()對(duì)每組的記錄數(shù)進(jìn)行統(tǒng)計(jì),如圖7.35所示。圖7.35查詢employee表中的每個(gè)部門(mén)的人數(shù)

7.3 Hive基本操作7.3.4 Hive數(shù)據(jù)查詢語(yǔ)言(HQL)(3)分組語(yǔ)句groupby和havinggroupby語(yǔ)句后面可以使用having子句來(lái)對(duì)分組結(jié)果進(jìn)行條件過(guò)濾。例如,統(tǒng)計(jì)employee表中部門(mén)人數(shù)大于2的信息,如圖7.36所示。可以使用as關(guān)鍵字對(duì)列或表重命名。having子句中的元素與groupby一樣,要么為聚合函數(shù),要么出現(xiàn)在select語(yǔ)句中。圖7.36統(tǒng)計(jì)employee表中部門(mén)人數(shù)大于2的信息

7.3 Hive基本操作7.3.4 Hive數(shù)據(jù)查詢語(yǔ)言(HQL)(4)orderby語(yǔ)句和sortby語(yǔ)句進(jìn)行排序sortby是對(duì)輸入數(shù)據(jù)進(jìn)行局部排序,并不是全局排序。當(dāng)設(shè)置的Reducer任務(wù)個(gè)數(shù)大于1時(shí),sortby會(huì)在每個(gè)Reducer任務(wù)中分別進(jìn)行排序,并不保證數(shù)據(jù)結(jié)果全局有序。當(dāng)Reducer只有1個(gè)時(shí),orderby與sortby的執(zhí)行結(jié)果相同。

7.3 Hive基本操作7.3.4 Hive數(shù)據(jù)查詢語(yǔ)言(HQL)(4)orderby語(yǔ)句和sortby語(yǔ)句進(jìn)行排序例如,對(duì)employee表按age進(jìn)行升序排序。當(dāng)Reducer任務(wù)個(gè)數(shù)為1個(gè)時(shí),圖7.37所示為使用orderby排序的情況,圖7.38所示為sortby排序的情況。從兩張圖中可以看出,當(dāng)Reducer個(gè)數(shù)為1時(shí),orderby與sortby的執(zhí)行結(jié)果相同。圖7.37Reducer任務(wù)個(gè)數(shù)為1時(shí)的orderby排序圖7.38Reducer任務(wù)個(gè)數(shù)為1時(shí)的sortby排序

7.3 Hive基本操作7.3.4 Hive數(shù)據(jù)查詢語(yǔ)言(HQL)(4)orderby語(yǔ)句和sortby語(yǔ)句進(jìn)行排序當(dāng)Reducer任務(wù)個(gè)數(shù)大于1時(shí),比如執(zhí)行命令“setmapred.reduce.tasks=2;”將Reducer任務(wù)個(gè)數(shù)設(shè)置為2個(gè)。使用orderby排序的情況如圖7.39所示,使用sortby排序結(jié)果如圖7.40所示。從兩個(gè)圖中可以看到,Reducer任務(wù)個(gè)數(shù)大于1個(gè)時(shí),orderby的Reducer任務(wù)個(gè)數(shù)仍然為1個(gè),仍然進(jìn)行全局排序,而sortby只是局部排序。圖7.39orderby全局排序圖7.40Reducer任務(wù)個(gè)數(shù)為2時(shí)的sortby排序

7.3 Hive基本操作7.3.4 Hive數(shù)據(jù)查詢語(yǔ)言(HQL)(5)distributeby和clusterby語(yǔ)句distributeby會(huì)根據(jù)它指定的規(guī)則將數(shù)據(jù)分到不同的Reducer任務(wù),相當(dāng)于MapReduce中的分區(qū)。distributeby一般結(jié)合sortby使用,但需寫(xiě)在sortby子句的前面,也就是先進(jìn)行分區(qū)再進(jìn)行排序,而且需要事先設(shè)置ReduceTask的個(gè)數(shù),使得Reducer任務(wù)個(gè)數(shù)大于1。例如,使distributeby語(yǔ)句對(duì)employe

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論