版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
大數(shù)據(jù)系列-Hive入門與實(shí)戰(zhàn)大數(shù)據(jù)系列-一、
Hive簡介二、Hive體系結(jié)構(gòu)三、Hive工作機(jī)制四、Hive應(yīng)用場景五、Hive安裝部署六、Hive開發(fā)使用七、SparkSQL簡介一、Hive簡介Hive簡介-Hive是什么?Hive是構(gòu)建在Hadoop之上的數(shù)據(jù)倉庫平臺Hive是一個SQL解析引擎,它將SQL語句轉(zhuǎn)譯成MapReduce作業(yè)并在Hadoop上執(zhí)行。Hive表是HDFS的一個文件目錄,一個表名對應(yīng)一個目錄名,如果有分區(qū)表的話,則分區(qū)值對應(yīng)子目錄名。Hive簡介-Hive是什么?Hive是構(gòu)建在Hadoop之Hive簡介-Hive的歷史由來Hive是Facebook開發(fā)的,構(gòu)建于Hadoop集群之上的數(shù)據(jù)倉庫應(yīng)用。2008年Facebook將Hive項(xiàng)目貢獻(xiàn)給Apache,成為開源項(xiàng)目。目前最新版本hive-2.0.0Hive簡介-Hive的歷史由來Hive是Facebook開Hive簡介-Hive的歷史由來Hadoop和Hive組建成為Facebook數(shù)據(jù)倉庫的發(fā)展史隨著數(shù)據(jù)量增加某些查詢需要幾個小時甚至幾天才能完成。當(dāng)數(shù)據(jù)達(dá)到1T時,MySql進(jìn)程跨掉??梢灾螏讉€T的數(shù)據(jù),但每天收集用戶點(diǎn)擊流數(shù)據(jù)(每天約400G)時,Oracle開始撐不住。有效解決了大規(guī)模數(shù)據(jù)的存儲與統(tǒng)計分析的問題,但是MapReduce程序?qū)τ谄胀ǚ治鋈藛T的使用過于復(fù)雜和繁瑣。對外提供了類似于SQL語法的HQL語句數(shù)據(jù)接口,自動將HQL語句編譯轉(zhuǎn)化為MR作業(yè)后在Hadoop上執(zhí)行。降低了分析人員使用Hadoop進(jìn)行數(shù)據(jù)分析的難度。Hive簡介-Hive的歷史由來Hadoop和Hive組建成一、Hive簡介二、
Hive體系結(jié)構(gòu)三、Hive工作機(jī)制四、Hive應(yīng)用場景五、Hive安裝部署六、Hive開發(fā)使用七、SparkSQL簡介一、Hive簡介Hive體系結(jié)構(gòu)-Hive在Hadoop中的位置Avro(序列化)Zookeeper(協(xié)調(diào)服務(wù))Pig(數(shù)據(jù)流)SqoopHive(SQL)MapReduce(分布式計算框架)Hbase(列存儲)HCatalog(元數(shù)據(jù))HDFS(Hadoop分布式文件系統(tǒng))程序語言計算表存儲對象存儲Hive體系結(jié)構(gòu)-Hive在Hadoop中的位置Avro(序Hive體系結(jié)構(gòu)-Hive設(shè)計特征
Hive做為Hadoop的數(shù)據(jù)倉庫處理工具,它所有的數(shù)據(jù)都存儲在Hadoop兼容的文件系統(tǒng)中。Hive在加載數(shù)據(jù)過程中不會對數(shù)據(jù)進(jìn)行任何的修改,只是將數(shù)據(jù)移動到HDFS中Hive設(shè)定的目錄下,因此,Hive不支持對數(shù)據(jù)的改寫和添加,所有的數(shù)據(jù)都是在加載的時候確定的。Hive的設(shè)計特點(diǎn)如下。支持索引,加快數(shù)據(jù)查詢。不同的存儲類型,例如,純文本文件、HBase中的文件。將元數(shù)據(jù)保存在關(guān)系數(shù)據(jù)庫中,減少了在查詢中執(zhí)行語義檢查時間??梢灾苯邮褂么鎯υ贖adoop文件系統(tǒng)中的數(shù)據(jù)。內(nèi)置大量用戶函數(shù)UDF來操作時間、字符串和其他的數(shù)據(jù)挖掘工具,支持用戶擴(kuò)展UDF函數(shù)來完成內(nèi)置函數(shù)無法實(shí)現(xiàn)的操作。類SQL的查詢方式,將SQL查詢轉(zhuǎn)換為MapReduce的job在Hadoop集群上執(zhí)行。編碼跟Hadoop同樣使用UTF-8字符集。Hive體系結(jié)構(gòu)-Hive設(shè)計特征Hive體系結(jié)構(gòu)用戶接口CLI:Cli啟動的時候,會同時啟動一個Hive副本。JDBC客戶端:封裝了Thrift,java應(yīng)用程序,可以通過指定的主機(jī)和端口連接到在另一個進(jìn)程中運(yùn)行的hive服務(wù)器ODBC客戶端:ODBC驅(qū)動允許支持ODBC協(xié)議的應(yīng)用程序連接到Hive。WUI接口:是通過瀏覽器訪問HiveThrift服務(wù)器基于socket通訊,支持跨語言。HiveThrift服務(wù)簡化了在多編程語言中運(yùn)行Hive的命令。綁定支持C++,Java,PHP,Python和Ruby語言。HiveHadoopThrift服務(wù)器解析器編譯器優(yōu)化器執(zhí)行器元數(shù)據(jù)庫MapReduceHDFS數(shù)據(jù)倉庫用戶接口CLI接口JDBC/ODBC客戶端WEB接口Hive體系結(jié)構(gòu)用戶接口HiveHadoopThrift服務(wù)Hive體系結(jié)構(gòu)解析器編譯器:完成HQL語句從詞法分析、語法分析、編譯、優(yōu)化以及執(zhí)行計劃的生成。優(yōu)化器是一個演化組件,當(dāng)前它的規(guī)則是:列修剪,謂詞下壓。執(zhí)行器會順序執(zhí)行所有的Job。如果Task鏈不存在依賴關(guān)系,可以采用并發(fā)執(zhí)行的方式執(zhí)行Job。元數(shù)據(jù)庫Hive的數(shù)據(jù)由兩部分組成:數(shù)據(jù)文件和元數(shù)據(jù)。元數(shù)據(jù)用于存放Hive庫的基礎(chǔ)信息,它存儲在關(guān)系數(shù)據(jù)庫中,如mysql、derby。元數(shù)據(jù)包括:數(shù)據(jù)庫信息、表的名字,表的列和分區(qū)及其屬性,表的屬性,表的數(shù)據(jù)所在目錄等。HadoopHive的數(shù)據(jù)文件存儲在HDFS中,大部分的查詢由MapReduce完成。(對于包含*的查詢,比如select*fromtbl不會生成MapRedcue作業(yè))HiveHadoopThrift服務(wù)器解析器編譯器優(yōu)化器執(zhí)行器元數(shù)據(jù)庫MapReduceHDFS數(shù)據(jù)倉庫用戶接口CLI接口JDBC/ODBC客戶端WEB接口Hive體系結(jié)構(gòu)解析器HiveHadoopThrift服務(wù)器一、Hive簡介二、Hive體系結(jié)構(gòu)三、Hive工作機(jī)制四、Hive應(yīng)用場景五、Hive安裝部署六、Hive開發(fā)使用七、SparkSQL簡介一、Hive簡介HadoopHive的運(yùn)行機(jī)制hive用戶通過用戶接口連接Hive,發(fā)布HiveSQLHive解析查詢并制定查詢計劃Hive將查詢轉(zhuǎn)換成MapReduce作業(yè)Hive在Hadoop上執(zhí)行MapReduce作業(yè)sqlMap/Reducehdfstable1table2table3......用戶用戶接口1234HadoopHive的運(yùn)行機(jī)制hive用戶通過用戶接口連接HHive編譯器的運(yùn)行機(jī)制(Hive的核心)語義解析器將查詢字符串轉(zhuǎn)換成解析樹表達(dá)式。
語法解析器將解析樹轉(zhuǎn)換成基于語句塊的內(nèi)部查詢表達(dá)式。邏輯計劃生成器將內(nèi)部查詢表達(dá)式轉(zhuǎn)換為邏輯計劃,這些計劃由邏輯操作樹組成,操作符是Hive的最小處理單元,每個操作符處理代表一道HDFS操作或者是MR作業(yè)。查詢計劃生成器將邏輯計劃轉(zhuǎn)化成物理計劃(MRJob)。Hive編譯器的運(yùn)行機(jī)制(Hive的核心)語義解析器將查詢字一、Hive簡介二、Hive體系結(jié)構(gòu)三、Hive工作機(jī)制四、
Hive應(yīng)用場景五、Hive安裝部署六、Hive開發(fā)使用七、SparkSQL簡介一、Hive簡介Hive的應(yīng)用場景-Hive的優(yōu)勢解決了傳統(tǒng)關(guān)系數(shù)據(jù)庫在大數(shù)據(jù)處理上的瓶頸。適合大數(shù)據(jù)的批量處理。充分利用集群的CPU計算資源、存儲資源,實(shí)現(xiàn)并行計算。Hive支持標(biāo)準(zhǔn)SQL語法,免去了編寫MR程序的過程,減少了開發(fā)成本。具有良好的擴(kuò)展性,拓展功能方便。Hive的應(yīng)用場景-Hive的優(yōu)勢Hive的優(yōu)勢-上百行MR程序與一條HQL的對比Hive的優(yōu)勢-上百行MR程序與一條HQL的對比Hive的應(yīng)用場景-Hive的缺點(diǎn)Hive的HQL表達(dá)能力有限:有些復(fù)雜運(yùn)算用HQL不易表達(dá)。Hive效率低:Hive自動生成MR作業(yè),通常不夠智能;HQL調(diào)優(yōu)困難,粒度較粗;可控性差。針對Hive運(yùn)行效率低下的問題,促使人們?nèi)ふ乙环N更快,更具交互性的分析框架。SparkSQL的出現(xiàn)則有效的提高了Sql在Hadoop上的分析運(yùn)行效率。Hive的應(yīng)用場景-Hive的缺點(diǎn)Hive的HQL表達(dá)能力有Hive的應(yīng)用場景適用場景海量數(shù)據(jù)的存儲處理數(shù)據(jù)挖掘海量數(shù)據(jù)的離線分析不適用場景復(fù)雜的機(jī)器學(xué)習(xí)算法復(fù)雜的科學(xué)計算聯(lián)機(jī)交互式實(shí)時查詢Hive的應(yīng)用場景適用場景一、Hive簡介二、Hive體系結(jié)構(gòu)三、Hive工作機(jī)制四、Hive應(yīng)用場景五、Hive安裝部署六、Hive開發(fā)使用七、SparkSQL簡介一、Hive簡介一、Hive簡介二、Hive體系結(jié)構(gòu)三、Hive工作機(jī)制四、Hive應(yīng)用場景五、Hive安裝部署六、Hive開發(fā)使用七、SparkSQL簡介一、Hive簡介Hive開發(fā)使用-Hive的連接HiveServer2目前Hive的Thrift服務(wù)端通常使用HiveServer2,它是HiveServer改進(jìn)版本,它提供了新的ThriftAPI來處理JDBC或者ODBC客戶端,可以進(jìn)行Kerberos身份驗(yàn)證,支持多個客戶端并發(fā)。BeeLineHiveServer2還提供了新的CLI:BeeLine,它是Hive0.11引入的新的交互式CLI,基于SQLLine,可以作為HiveJDBCClient端訪問HievServer2。通過BeeLine連接hivehive安裝目錄/bin/./beeline-ujdbc:hive2://hiveServer2所在ip:端口號-n用戶名例如:./beeline-ujdbc:hive2://127.0.0.1:10000-nrootHive開發(fā)使用-Hive的連接HiveServer2Hive開發(fā)使用-Hive的基本數(shù)據(jù)類型Hive開發(fā)使用-Hive的基本數(shù)據(jù)類型Hive開發(fā)使用-Hive的復(fù)雜數(shù)據(jù)類型Hive開發(fā)使用-Hive的復(fù)雜數(shù)據(jù)類型Hive開發(fā)使用-Hive元數(shù)據(jù)庫表簡介Hive開發(fā)使用-Hive元數(shù)據(jù)庫表簡介Hive開發(fā)使用-Hive的數(shù)據(jù)模型Hive數(shù)據(jù)庫類似傳統(tǒng)數(shù)據(jù)庫的DataBase,在元數(shù)據(jù)庫里實(shí)際是一張表。對應(yīng)于HDFS上的數(shù)據(jù)倉庫目錄下是一個文件夾。數(shù)據(jù)倉庫目錄路徑,由hive-site.xml中${hive.metastore.warehouse.dir}參數(shù)指定。創(chuàng)建數(shù)據(jù)庫示例:createdatabase數(shù)據(jù)庫名;元數(shù)據(jù)庫中查詢數(shù)據(jù)庫列表:select*fromdbs;如下圖:Hive開發(fā)使用-Hive的數(shù)據(jù)模型Hive數(shù)據(jù)庫Hive開發(fā)使用-Hive的數(shù)據(jù)模型Hive數(shù)據(jù)庫
hive-site.xml中的數(shù)據(jù)倉庫目錄設(shè)置,如下圖:HDFS下對應(yīng)存儲目錄,數(shù)據(jù)庫名后綴為.db的數(shù)據(jù)庫列表,如下圖,Hive開發(fā)使用-Hive的數(shù)據(jù)模型Hive數(shù)據(jù)庫HDFS下Hive開發(fā)使用-Hive的數(shù)據(jù)模型內(nèi)部表
內(nèi)部表與關(guān)系數(shù)據(jù)庫中的Table在概念上類似。每一個Table在Hive中都有一個相應(yīng)的目錄存儲數(shù)據(jù)。所有的Table數(shù)據(jù)(不包括ExternalTable)都保存在這個目錄中。刪除表時,元數(shù)據(jù)與數(shù)據(jù)都會被刪除。元數(shù)據(jù)庫中查詢數(shù)據(jù)表列表:
HDFS下對應(yīng)存儲目錄:Hive開發(fā)使用-Hive的數(shù)據(jù)模型元數(shù)據(jù)庫中查詢數(shù)據(jù)表列表Hive開發(fā)使用-Hive的數(shù)據(jù)模型
外部表
外部表指向已經(jīng)在HDFS中存在的數(shù)據(jù),可以創(chuàng)建Partition。它和內(nèi)部表在元數(shù)據(jù)的組織上是相同的,而實(shí)際數(shù)據(jù)的存儲則有較大的差異。內(nèi)部表的創(chuàng)建過程和數(shù)據(jù)加載過程這兩個過程可以分別獨(dú)立完成,也可以在同一個語句中完成,在加載數(shù)據(jù)的過程中,實(shí)際數(shù)據(jù)會被移動到數(shù)據(jù)倉庫目錄中;之后對數(shù)據(jù)訪問將會直接在數(shù)據(jù)倉庫目錄中完成。刪除表時,表中的數(shù)據(jù)和元數(shù)據(jù)將會被同時刪除。而外部表只有一個過程,加載數(shù)據(jù)和創(chuàng)建表同時完成(CREATEEXTERNALTABLE……LOCATION),實(shí)際數(shù)據(jù)是存儲在LOCATION后面指定的HDFS路徑中,并不會移動到數(shù)據(jù)倉庫目錄中。當(dāng)刪除一個ExternalTable時,僅刪除該鏈接。Hive開發(fā)使用-Hive的數(shù)據(jù)模型Hive開發(fā)使用-Hive的數(shù)據(jù)模型如何選擇使用內(nèi)部表或外部表?如果所有處理都由hive來完成,則使用內(nèi)部表如果需要用hive和外部其他工具處理同一組數(shù)據(jù)集,則使用外部表。Hive開發(fā)使用-Hive的數(shù)據(jù)模型如何選擇使用內(nèi)部表或外部Hive開發(fā)使用-Hive的數(shù)據(jù)模型
分區(qū)
Partition對應(yīng)于關(guān)系數(shù)據(jù)庫中的Partition列的密集索引,但是Hive中Partition的組織方式和數(shù)據(jù)庫中的很不相同。在Hive中,表中的一個Partition對應(yīng)于表下的一個目錄,所有的Partition的數(shù)據(jù)都存儲在對應(yīng)的目錄中。例如pvs表中包含ds和city兩個Partition,則對應(yīng)于ds=20090801,city=jinan的HDFS子目錄為:/wh/pvs/ds=20090801/city=jinan;對應(yīng)于ds=20090801,city=qingdao的HDFS子目錄為:/wh/pvs/ds=20090801/city=qingdao。Hive開發(fā)使用-Hive的數(shù)據(jù)模型Hive開發(fā)使用-Hive的數(shù)據(jù)模型
桶
Buckets是將表的列通過Hash算法進(jìn)一步分解成不同的文件存儲。它對指定列計算hash,根據(jù)hash值切分?jǐn)?shù)據(jù),目的是為了并行,每一個Bucket對應(yīng)一個文件。分區(qū)是粗粒度的劃分,桶是細(xì)粒度的劃分,這樣做為了可以讓查詢發(fā)生在小范圍的數(shù)據(jù)上以提高效率。適合進(jìn)行表連接查詢、適合用于采樣分析。例如將user列分散至32個bucket,首先對user列的值計算hash,則對應(yīng)hash值為0的HDFS目錄為:/wh/pvs/ds=20090801/ctry=US/part-00000;對應(yīng)hash值為20的HDFS目錄為:/wh/pvs/ds=20090801/ctry=US/part-00020。如果想應(yīng)用很多的Map任務(wù)這樣是不錯的選擇。Hive開發(fā)使用-Hive的數(shù)據(jù)模型Hive開發(fā)使用-Hive的數(shù)據(jù)模型
Hive的視圖視圖與傳統(tǒng)數(shù)據(jù)庫的視圖類似。視圖是只讀的,它基于的基本表,如果改變,數(shù)據(jù)增加不會影響視圖的呈現(xiàn);如果刪除,會出現(xiàn)問題。如果不指定視圖的列,會根據(jù)select語句后的生成。
視圖的簡單示例:創(chuàng)建表:createviewtest_viewasselect*fromtest;查看數(shù)據(jù):select*fromtest_view;Hive開發(fā)使用-Hive的數(shù)據(jù)模型Hive開發(fā)使用-Hive的數(shù)據(jù)存儲模型數(shù)據(jù)庫(database)表(table)表(table)常規(guī)數(shù)據(jù)(data)(Buckets)桶(Buckets)桶分區(qū)(Partition)分區(qū)(Partition)(Buckets)桶(Buckets)桶Hive開發(fā)使用-Hive的數(shù)據(jù)存儲模型數(shù)據(jù)庫表表常規(guī)數(shù)據(jù)分Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令CREATETABLE創(chuàng)建一個指定名字的表。如果相同名字的表已經(jīng)存在,則拋出異常;用戶可以用IFNOTEXIST選項(xiàng)來忽略這個異常。EXTERNAL關(guān)鍵字可以讓用戶創(chuàng)建一個外部表,在建表的同時指定一個指向?qū)嶋H數(shù)據(jù)的路徑(LOCATION),有分區(qū)的表可以在創(chuàng)建的時候使用PARTITIONEDBY語句。一個表可以擁有一個或者多個分區(qū),每一個分區(qū)單獨(dú)存在一個目錄下。表和分區(qū)都可以對某個列進(jìn)行CLUSTEREDBY操作,將若干個列放入一個桶(bucket)中。可以利用SORTBY對數(shù)據(jù)進(jìn)行排序。這樣可以為特定應(yīng)用提高性能。默認(rèn)的字段分隔符為ascii碼的控制符\001(^A)tab分隔符為\t。只支持單個字符的分隔符。如果文件數(shù)據(jù)是純文本,可以使用STOREDASTEXTFILE。如果數(shù)據(jù)需要壓縮,使用STOREDASSEQUENCE。CREATE[EXTERNAL]TABLE[IFNOTEXISTS]table_name
[(col_namedata_type[COMMENTcol_comment],...)][COMMENTtable_comment]
[PARTITIONEDBY(col_namedata_type[COMMENTcol_comment],...)]
[CLUSTEREDBY(col_name,col_name,...)[SORTEDBY(col_name[ASC|DESC],...)]INTOnum_bucketsBUCKETS]
[ROWFORMATrow_format]
[STOREDASfile_format][LOCATIONhdfs_path]Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令CREATETABHive開發(fā)使用-Hive加載數(shù)據(jù)命令Load操作只是單純的復(fù)制/移動操作,將數(shù)據(jù)文件移動到Hive表對應(yīng)的位置。如果表中存在分區(qū),則必須指定分區(qū)名。加載本地數(shù)據(jù),指定LOCAL關(guān)鍵字,即本地,可以同時給定分區(qū)信息。load命令會去查找本地文件系統(tǒng)中的filepath。如果發(fā)現(xiàn)是相對路徑,則路徑會被解釋為相對于當(dāng)前用戶的當(dāng)前路徑。用戶也可以為本地文件指定一個完整的URI,比如:file:///user/hive/project/data1.例如:加載本地數(shù)據(jù),同時給定分區(qū)信息:hive>LOADDATALOCALINPATH'file:///examples/files/kv2.txt'OVERWRITEINTOTABLEinvitesPARTITION(ds='2008-08-15');加載DFS數(shù)據(jù),同時給定分區(qū)信息:如果filepath可以是相對路徑URI路徑,對于相對路徑,Hive會使用在hadoop配置文件中定義的fs.defaultFS指定的Namenode的URI來自動拼接完整路徑。例如
:加載數(shù)據(jù)到hdfs中,同時給定分區(qū)信息hive>LOADDATAINPATH'/user/myname/kv2.txt'OVERWRITEINTOTABLEinvitesPARTITION(ds='2008-08-15');OVERWRITE指定OVERWRITE,目標(biāo)表(或者分區(qū))中的內(nèi)容(如果有)會被刪除,然后再將filepath指向的文件/目錄中的內(nèi)容添加到表/分區(qū)中。如果目標(biāo)表(分區(qū))已經(jīng)有一個文件,并且文件名和filepath中的文件名沖突,那么現(xiàn)有的文件會被新文件所替代。LOADDATA[LOCAL]INPATH'filepath'[OVERWRITE]INTOTABLEtablename[PARTITION(partcol1=val1,partcol2=val2...)]Hive開發(fā)使用-Hive加載數(shù)據(jù)命令Load操作只是單純Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例內(nèi)部表
例如:創(chuàng)建人員信息表person_inside,列以逗號","分隔。
建表示例:createtableperson_inside(idstring,namestring,sexstring,ageint)rowformatdelimitedfieldsterminatedby','storedastextfile;加載數(shù)據(jù):本地數(shù)據(jù)位置:/tmp/person.txtloaddatalocalinpath'file:///tmp/person.txt'intotableperson_inside;Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例外部表
例如:創(chuàng)建人員信息表person_ex,列以逗號","分隔。外部表對應(yīng)路徑:hdfs://mycluster/hivedb/person.txt
建表示例:createexternaltableperson_ext(idstring,namestring,sexstring,ageint)rowformatdelimitedfieldsterminatedby','storedastextfilelocation'/hivedb';(注意:location后面跟的是目錄,不是文件,hive將依據(jù)默認(rèn)配置的hdfs路徑,自動將整個目錄下的文件都加載到表中)Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例外部表
hive默認(rèn)數(shù)據(jù)倉庫路徑下,不會生成外部表的文件目錄,如下圖:查看表信息:descformattedperson_ext;查看location指向。如下圖:Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例查看表信息:dHive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例外部表
查詢數(shù)據(jù):select*fromperson_ext;刪除表:droptableperson_ext;只刪除邏輯表,不刪除數(shù)據(jù)文件,數(shù)據(jù)文件依然存在。如下圖:Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例查詢數(shù)據(jù):selHive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例分區(qū)表
例如:創(chuàng)建人員信息表person_part,列以逗號","分隔。建立city為分區(qū)。建表示例:createtableperson_part(idstring,namestring,sexstring,ageint)partitionedby(citystring)rowformatdelimitedfieldsterminatedby','storedastextfile;加載數(shù)據(jù):本地數(shù)據(jù)位置:/tmp/person.txtloaddatalocalinpath'file:///tmp/person.txt'intotableperson_partpartition(city='jinan');Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例分區(qū)表
數(shù)據(jù)存儲在以分區(qū)city='jinan'為目錄的路徑下,如下圖:根據(jù)分區(qū)查詢數(shù)據(jù):hive會自動判斷where語句中是否包含分區(qū)的字段。而且可以使用大于小于等運(yùn)算符select*fromperson_partwherecity='jinan';如下圖:Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例根據(jù)分區(qū)查詢數(shù)據(jù)Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例分桶表
例如:創(chuàng)建人員信息表person_bucket,列以逗號","分隔,在年齡age字段上建5個桶。
建表示例:
createtableperson_bucket
(idstring,namestring,sexstring,ageint)partitionedby(citystring)
clusteredby(age)sortedby(name)into5
bucketsrowformatdelimitedfieldsterminatedby','
storedastextfile;打開桶參數(shù):sethive.enforce.bucketing=true;加載數(shù)據(jù):insertintotableperson_bucketpartition(city='jinan')select*fromperson_inside;
Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例分桶表
數(shù)據(jù)加載到桶表時,會對字段取hash值,然后與桶的數(shù)量取模。把數(shù)據(jù)放到對應(yīng)的文件中。如下圖:
抽樣查詢:查詢5個桶中的第2個桶,即000001_0文件select*fromperson_buckettablesample(bucket2outof5onage);Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例抽Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例分桶表:注意:要生成桶的數(shù)據(jù),只能是由其他表通過insertinto或是insertoverwrite導(dǎo)入數(shù)據(jù),如果使用LOADDATA加載數(shù)據(jù),則不能生成桶數(shù)據(jù)。定義桶可以使用整型字段或是string類型字段。若表沒有定義桶也可以進(jìn)行隨機(jī)抽樣,但是要全表掃描,速度慢。必須先sethive.enforce.bucketing=true,才可以將數(shù)據(jù)正常寫入桶中。Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例Hive開發(fā)使用-數(shù)據(jù)導(dǎo)出命令導(dǎo)出到本地文件系統(tǒng)insertoverwritelocaldirectory'/tmp/exportest/'select*fromperson_inside;注意:導(dǎo)出路徑為文件夾路徑,不必指定文件名。執(zhí)行語句后,會在本地目錄的/tmp/hivedb/下生成一個000000_0結(jié)果集數(shù)據(jù)文件。如下圖:導(dǎo)出的數(shù)據(jù)列之間的分隔符默認(rèn)是^A(ascii碼是\001)。如下圖:Hive開發(fā)使用-數(shù)據(jù)導(dǎo)出命令Hive開發(fā)使用-數(shù)據(jù)導(dǎo)出命令導(dǎo)出到HDFS中insertoverwritedirectory'/hivedb'select*fromperson_inside;注意:導(dǎo)出路徑為文件夾路徑,不必指定文件名。執(zhí)行語句后,會在HDFS目錄的/hivedb下生成一個000000_0結(jié)果集數(shù)據(jù)文件。如下圖:Hive開發(fā)使用-數(shù)據(jù)導(dǎo)出命令Hive開發(fā)使用-數(shù)據(jù)導(dǎo)出命令導(dǎo)出到Hive的另一個表中insertintotableperson_partpartition(city='jinan')select*fromperson_inside;Hive開發(fā)使用-數(shù)據(jù)導(dǎo)出命令Hive開發(fā)使用-數(shù)據(jù)查詢命令基于Partition的查詢例如:分區(qū)為citySELECT*FROMperson_partWHEREcity='jinan';限制條數(shù)查詢LIMITLimit可以限制查詢的記錄數(shù)。查詢的結(jié)果是隨機(jī)選擇的。下面的查詢語句從t1表中隨機(jī)查詢5條記錄:SELECT*FROMperson_insideLIMIT5;TopN查詢下面的查詢語句查詢年齡最大的5個人。setmapred.reduce.tasks=2;設(shè)置mapReduce任務(wù)數(shù)為2個select*fromperson_insidesortbyagedesclimit5;Hive開發(fā)使用-數(shù)據(jù)查詢命令Hive開發(fā)使用-數(shù)據(jù)表連接命令Hive只支持等值連接,即ON子句中使用等號連接,不支持非等值連接。如果連接語句中有WHERE子句,會先執(zhí)行JOIN子句,再執(zhí)行WHERE子句??梢詊oin多個表。示例:表employee數(shù)據(jù)如下:表job數(shù)據(jù)如下:Hive開發(fā)使用-數(shù)據(jù)表連接命令表job數(shù)據(jù)如下:Hive開發(fā)使用-數(shù)據(jù)表連接命令創(chuàng)建employee表創(chuàng)建表createtableemployee(employee_idstring,namestring)rowformatdelimitedfieldsterminatedby','storedastextfile;加載數(shù)據(jù):本地數(shù)據(jù)位置:/tmp/employee.txtloaddatalocalinpath'file:///tmp/employee.txt'intotableemployee;創(chuàng)建job表創(chuàng)建表createtablejob(job_idstring,jobstring,employee_idstring)rowformatdelimitedfieldsterminatedby','storedastextfile;加載數(shù)據(jù):本地數(shù)據(jù)位置:/tmp/job.txtloaddatalocalinpath'file:///tmp/job.txt'intotablejob;Hive開發(fā)使用-數(shù)據(jù)表連接命令Hive開發(fā)使用-數(shù)據(jù)表連接命令內(nèi)連接內(nèi)連接指的是把符合兩邊連接條件的數(shù)據(jù)查詢出來。查詢語句select*fromemployeejoinjobonemployee.employee_id=job.employee_id;結(jié)果如下:Hive開發(fā)使用-數(shù)據(jù)表連接命令內(nèi)連接指的是把符合兩邊連接條Hive開發(fā)使用-數(shù)據(jù)表連接命令左外連接如果左邊有數(shù)據(jù),右邊沒有數(shù)據(jù),則左邊有數(shù)據(jù)的記錄的對應(yīng)列返回為空。查詢語句
select*fromemployeeleftouterjoinjobonemployee.employee_id=job.employee_id;注意:不能使用leftjoin,只能使用leftouterjoin。結(jié)果如下:Hive開發(fā)使用-數(shù)據(jù)表連接命令如果左邊有數(shù)據(jù),右邊沒有數(shù)Hive開發(fā)使用-數(shù)據(jù)表連接命令右外連接如果左邊沒有數(shù)據(jù),右邊有數(shù)據(jù),則右邊有數(shù)據(jù)的記錄對應(yīng)列返回為空。查詢語句select*fromemployeerightouterjoinjobonemployee.employee_id=job.employee_id;注意:不能使用rightjoin,只能使用rightouterjoin。結(jié)果如下:Hive開發(fā)使用-數(shù)據(jù)表連接命令如果左邊沒有數(shù)據(jù),右邊有數(shù)Hive開發(fā)使用-數(shù)據(jù)表連接命令全外連接顯示內(nèi)連接,左外連接,右外連接的合集。查詢語句select*fromemployeefullouterjoinjobonemployee.employee_id=job.employee_id;結(jié)果如下:Hive開發(fā)使用-數(shù)據(jù)表連接命令顯示內(nèi)連接,左外連接,右外連Hive開發(fā)使用-數(shù)據(jù)表連接命令左半連接左半連接與in操作或者exists操作,效果一樣。查詢語句select*fromemployeeleftsemijoinjobonemployee.employee_id=job.employee_id;結(jié)果如下:上面語句相當(dāng)于如下語句:select*fromemployeewhereemployee_idin(selectemployee_idfromjob);Hive開發(fā)使用-數(shù)據(jù)表連接命令左半連接與in操作或者exiHive開發(fā)使用-數(shù)據(jù)表連接命令hive0.9.0版本開始支持in、notin、like、notlikein
左邊的表在右邊表的范圍內(nèi)。與leftsemijoin效果一樣。select*fromemployeewhereemployee_idin(selectemployee_idfromjob);結(jié)果如下:左邊的表不在右邊表的范圍內(nèi)。select*fromemployeewhereemployee_idnotin(selectemployee_idfromjob);結(jié)果如下:notinHive開發(fā)使用-數(shù)據(jù)表連接命令左邊的notlikeHive開發(fā)使用-數(shù)據(jù)表連接命令like查詢左右模糊匹配的所有結(jié)果。select*fromemployeewherenamelike'張%';結(jié)果如下:查詢左右模糊匹配以外的所有結(jié)果。select*fromemployeewherenamenotlike'張%';結(jié)果如下:Hive開發(fā)使用-數(shù)據(jù)表連接命令查詢左右模糊匹配的所有結(jié)果。Hive開發(fā)使用-常用顯示命令查詢數(shù)據(jù)庫:showdatabases;模糊搜索表:showtableslike'*name*';刪除數(shù)據(jù)庫:dropdatabasedbname;刪除數(shù)據(jù)表:droptabletablename;查看表結(jié)構(gòu)信息:desctable_name;查看詳細(xì)表結(jié)構(gòu)信息:descformattedtable_name;查看分區(qū)信息:showpartitionstable_name;查看hdfs文件列表信息:hadoopfs-ls/user/hive/warehouse/查看hdfs文件內(nèi)容:hadoopfs-cat/user/hive/warehouse/file.txtHive開發(fā)使用-常用顯示命令查詢數(shù)據(jù)庫:showdataHive開發(fā)使用-java客戶端hive需要引用的客戶端jar包列表: java端連接hive,需要預(yù)先引入hive相關(guān)的客戶端jar包,jar包可以直接從hive安裝包的lib目錄下拷貝。jar包列表如下:Hive開發(fā)使用-java客戶端Hive客戶端java代碼,如下:
Hive開發(fā)使用-java客戶端Hive開發(fā)使用-java客戶端一、Hive簡介二、Hive體系結(jié)構(gòu)三、Hive工作機(jī)制四、Hive應(yīng)用場景五、Hive安裝部署六、Hive開發(fā)使用七、SparkSQL簡介一、Hive簡介什么是SparkSQLSparkSQL做為Spark生態(tài)里的成員。它是一個基于Spark引擎,運(yùn)行在Hadoop上的SQL工具。它兼容Hive、RDD、parquet(列式存儲)文件、JSON文件等數(shù)據(jù)源。在Hadoop上運(yùn)行sql,具備較高的運(yùn)行效率。ApacheSparkSparkSQLSpark流式計算MLlib機(jī)器學(xué)習(xí)GraphX圖計算SparkSQL什么是SparkSQLApacheSparkSparkSpSparkSQL發(fā)展歷程hiveHive降低了分析人員使用Hadoop的難度。但MapReduce產(chǎn)生了大量的中間磁盤操作,消耗了大量的I/O,降低了Hive的運(yùn)行效率。shark伯克利實(shí)驗(yàn)室修改了內(nèi)存管理、物理計劃、執(zhí)行三個模塊,并使之能運(yùn)行在Spark引擎上。使得SQL查詢的速度得到10-100倍的提升。但是它對于Hive依賴程度較高。做為hive的發(fā)展計劃,使得Hive能夠支持Spark執(zhí)行引擎。HiveonSparkSparkSQL作為Spark生態(tài)的一員繼續(xù)發(fā)展,擺脫了對hive的依賴性,無論在數(shù)據(jù)兼容、性能優(yōu)化、組件擴(kuò)展方面都得到了極大的方便。SparkSQL發(fā)展歷程hiveHive降低了分析人員使用SparkSQL的連接SparkSQL類似Hive,同樣提供了CLI和ThriftServer。使得hive用戶和用慣了命令行的RDBMS數(shù)據(jù)庫管理員很容易地上手sparkSQL。ThriftServerThriftServer是一個JDBC/ODBC接口,用戶可以通過JDBC/ODBC連接ThriftServer來訪問SparkSQL的數(shù)據(jù)<property><name>hive.server2.thrift.port</name><value>10000</value></property>啟動ThriftServer,連接Hive前,可將Hive下的hive-site.xml文件直接拷貝到$SPARK_HOME/conf目錄下,可依據(jù)需要修改相應(yīng)的ThriftServer的端口號,默認(rèn)端口號為10000。SparkSQL的連接SparkSQL類似HivSparkSQL的連接ThriftServer啟動和停止
進(jìn)入$SPARK_HOME/sbin目錄cd$SPARK_HOME/sbinThriftServer啟動./start-thriftserver.shThriftServer停止./stop-thriftserver.shSparkSQL的連接ThriftServer啟動和停止SparkSQL的連接BeeLineSparkSQL類似Hive也提供了beeLine連接方式,可以作為SparkJDBCClient端訪問ThriftServer。通過BeeLine連接hive進(jìn)入$SPARK_HOME/bin目錄cd$SPARK_HOME/bin連接ThriftServer服務(wù)./beeline-ujdbc:hive2:ThriftServer主機(jī)ip:端口號-n用戶名例如:./beeline-ujdbc:hive2://127.0.0.1:10000-nrootSparkSQL的連接BeeLine手工準(zhǔn)備表的基礎(chǔ)數(shù)據(jù),表名規(guī)則:郵箱帳號_表名。通過客戶端beeline連接hive。創(chuàng)建個人數(shù)據(jù)庫。數(shù)據(jù)庫名規(guī)則:郵箱帳號_數(shù)據(jù)庫名。切換到個人數(shù)據(jù)庫。例如:use數(shù)據(jù)庫名。創(chuàng)建內(nèi)部表、導(dǎo)入數(shù)據(jù),查看hdfs下的數(shù)據(jù)存放模式。創(chuàng)建外部表,查看hdfs下的數(shù)據(jù)存放模式,刪除外部表,對照刪除內(nèi)部表,查看hdfs下的數(shù)據(jù)刪除情況。創(chuàng)建分區(qū)表,導(dǎo)入數(shù)據(jù),查看hdfs下的數(shù)據(jù)存放模式。創(chuàng)建桶表,,導(dǎo)入數(shù)據(jù),查看hdfs下的數(shù)據(jù)存放模式。
Hive開發(fā)使用-練習(xí)指導(dǎo)Hive開發(fā)使用-練習(xí)指導(dǎo)數(shù)據(jù)導(dǎo)出,導(dǎo)出到本地、導(dǎo)出到hdfs,導(dǎo)出到一個表中。數(shù)據(jù)查詢命名:分區(qū)查詢、limit、表關(guān)聯(lián)查詢等基本操作指令。通過java客戶端,編寫代碼,連接hive并執(zhí)行數(shù)據(jù)庫查詢操作。
Hive開發(fā)使用-練習(xí)指導(dǎo)Hive開發(fā)使用-練習(xí)指導(dǎo)謝謝大家!謝謝謝謝大家!謝謝大數(shù)據(jù)系列-Hive入門與實(shí)戰(zhàn)大數(shù)據(jù)系列-一、
Hive簡介二、Hive體系結(jié)構(gòu)三、Hive工作機(jī)制四、Hive應(yīng)用場景五、Hive安裝部署六、Hive開發(fā)使用七、SparkSQL簡介一、Hive簡介Hive簡介-Hive是什么?Hive是構(gòu)建在Hadoop之上的數(shù)據(jù)倉庫平臺Hive是一個SQL解析引擎,它將SQL語句轉(zhuǎn)譯成MapReduce作業(yè)并在Hadoop上執(zhí)行。Hive表是HDFS的一個文件目錄,一個表名對應(yīng)一個目錄名,如果有分區(qū)表的話,則分區(qū)值對應(yīng)子目錄名。Hive簡介-Hive是什么?Hive是構(gòu)建在Hadoop之Hive簡介-Hive的歷史由來Hive是Facebook開發(fā)的,構(gòu)建于Hadoop集群之上的數(shù)據(jù)倉庫應(yīng)用。2008年Facebook將Hive項(xiàng)目貢獻(xiàn)給Apache,成為開源項(xiàng)目。目前最新版本hive-2.0.0Hive簡介-Hive的歷史由來Hive是Facebook開Hive簡介-Hive的歷史由來Hadoop和Hive組建成為Facebook數(shù)據(jù)倉庫的發(fā)展史隨著數(shù)據(jù)量增加某些查詢需要幾個小時甚至幾天才能完成。當(dāng)數(shù)據(jù)達(dá)到1T時,MySql進(jìn)程跨掉??梢灾螏讉€T的數(shù)據(jù),但每天收集用戶點(diǎn)擊流數(shù)據(jù)(每天約400G)時,Oracle開始撐不住。有效解決了大規(guī)模數(shù)據(jù)的存儲與統(tǒng)計分析的問題,但是MapReduce程序?qū)τ谄胀ǚ治鋈藛T的使用過于復(fù)雜和繁瑣。對外提供了類似于SQL語法的HQL語句數(shù)據(jù)接口,自動將HQL語句編譯轉(zhuǎn)化為MR作業(yè)后在Hadoop上執(zhí)行。降低了分析人員使用Hadoop進(jìn)行數(shù)據(jù)分析的難度。Hive簡介-Hive的歷史由來Hadoop和Hive組建成一、Hive簡介二、
Hive體系結(jié)構(gòu)三、Hive工作機(jī)制四、Hive應(yīng)用場景五、Hive安裝部署六、Hive開發(fā)使用七、SparkSQL簡介一、Hive簡介Hive體系結(jié)構(gòu)-Hive在Hadoop中的位置Avro(序列化)Zookeeper(協(xié)調(diào)服務(wù))Pig(數(shù)據(jù)流)SqoopHive(SQL)MapReduce(分布式計算框架)Hbase(列存儲)HCatalog(元數(shù)據(jù))HDFS(Hadoop分布式文件系統(tǒng))程序語言計算表存儲對象存儲Hive體系結(jié)構(gòu)-Hive在Hadoop中的位置Avro(序Hive體系結(jié)構(gòu)-Hive設(shè)計特征
Hive做為Hadoop的數(shù)據(jù)倉庫處理工具,它所有的數(shù)據(jù)都存儲在Hadoop兼容的文件系統(tǒng)中。Hive在加載數(shù)據(jù)過程中不會對數(shù)據(jù)進(jìn)行任何的修改,只是將數(shù)據(jù)移動到HDFS中Hive設(shè)定的目錄下,因此,Hive不支持對數(shù)據(jù)的改寫和添加,所有的數(shù)據(jù)都是在加載的時候確定的。Hive的設(shè)計特點(diǎn)如下。支持索引,加快數(shù)據(jù)查詢。不同的存儲類型,例如,純文本文件、HBase中的文件。將元數(shù)據(jù)保存在關(guān)系數(shù)據(jù)庫中,減少了在查詢中執(zhí)行語義檢查時間??梢灾苯邮褂么鎯υ贖adoop文件系統(tǒng)中的數(shù)據(jù)。內(nèi)置大量用戶函數(shù)UDF來操作時間、字符串和其他的數(shù)據(jù)挖掘工具,支持用戶擴(kuò)展UDF函數(shù)來完成內(nèi)置函數(shù)無法實(shí)現(xiàn)的操作。類SQL的查詢方式,將SQL查詢轉(zhuǎn)換為MapReduce的job在Hadoop集群上執(zhí)行。編碼跟Hadoop同樣使用UTF-8字符集。Hive體系結(jié)構(gòu)-Hive設(shè)計特征Hive體系結(jié)構(gòu)用戶接口CLI:Cli啟動的時候,會同時啟動一個Hive副本。JDBC客戶端:封裝了Thrift,java應(yīng)用程序,可以通過指定的主機(jī)和端口連接到在另一個進(jìn)程中運(yùn)行的hive服務(wù)器ODBC客戶端:ODBC驅(qū)動允許支持ODBC協(xié)議的應(yīng)用程序連接到Hive。WUI接口:是通過瀏覽器訪問HiveThrift服務(wù)器基于socket通訊,支持跨語言。HiveThrift服務(wù)簡化了在多編程語言中運(yùn)行Hive的命令。綁定支持C++,Java,PHP,Python和Ruby語言。HiveHadoopThrift服務(wù)器解析器編譯器優(yōu)化器執(zhí)行器元數(shù)據(jù)庫MapReduceHDFS數(shù)據(jù)倉庫用戶接口CLI接口JDBC/ODBC客戶端WEB接口Hive體系結(jié)構(gòu)用戶接口HiveHadoopThrift服務(wù)Hive體系結(jié)構(gòu)解析器編譯器:完成HQL語句從詞法分析、語法分析、編譯、優(yōu)化以及執(zhí)行計劃的生成。優(yōu)化器是一個演化組件,當(dāng)前它的規(guī)則是:列修剪,謂詞下壓。執(zhí)行器會順序執(zhí)行所有的Job。如果Task鏈不存在依賴關(guān)系,可以采用并發(fā)執(zhí)行的方式執(zhí)行Job。元數(shù)據(jù)庫Hive的數(shù)據(jù)由兩部分組成:數(shù)據(jù)文件和元數(shù)據(jù)。元數(shù)據(jù)用于存放Hive庫的基礎(chǔ)信息,它存儲在關(guān)系數(shù)據(jù)庫中,如mysql、derby。元數(shù)據(jù)包括:數(shù)據(jù)庫信息、表的名字,表的列和分區(qū)及其屬性,表的屬性,表的數(shù)據(jù)所在目錄等。HadoopHive的數(shù)據(jù)文件存儲在HDFS中,大部分的查詢由MapReduce完成。(對于包含*的查詢,比如select*fromtbl不會生成MapRedcue作業(yè))HiveHadoopThrift服務(wù)器解析器編譯器優(yōu)化器執(zhí)行器元數(shù)據(jù)庫MapReduceHDFS數(shù)據(jù)倉庫用戶接口CLI接口JDBC/ODBC客戶端WEB接口Hive體系結(jié)構(gòu)解析器HiveHadoopThrift服務(wù)器一、Hive簡介二、Hive體系結(jié)構(gòu)三、Hive工作機(jī)制四、Hive應(yīng)用場景五、Hive安裝部署六、Hive開發(fā)使用七、SparkSQL簡介一、Hive簡介HadoopHive的運(yùn)行機(jī)制hive用戶通過用戶接口連接Hive,發(fā)布HiveSQLHive解析查詢并制定查詢計劃Hive將查詢轉(zhuǎn)換成MapReduce作業(yè)Hive在Hadoop上執(zhí)行MapReduce作業(yè)sqlMap/Reducehdfstable1table2table3......用戶用戶接口1234HadoopHive的運(yùn)行機(jī)制hive用戶通過用戶接口連接HHive編譯器的運(yùn)行機(jī)制(Hive的核心)語義解析器將查詢字符串轉(zhuǎn)換成解析樹表達(dá)式。
語法解析器將解析樹轉(zhuǎn)換成基于語句塊的內(nèi)部查詢表達(dá)式。邏輯計劃生成器將內(nèi)部查詢表達(dá)式轉(zhuǎn)換為邏輯計劃,這些計劃由邏輯操作樹組成,操作符是Hive的最小處理單元,每個操作符處理代表一道HDFS操作或者是MR作業(yè)。查詢計劃生成器將邏輯計劃轉(zhuǎn)化成物理計劃(MRJob)。Hive編譯器的運(yùn)行機(jī)制(Hive的核心)語義解析器將查詢字一、Hive簡介二、Hive體系結(jié)構(gòu)三、Hive工作機(jī)制四、
Hive應(yīng)用場景五、Hive安裝部署六、Hive開發(fā)使用七、SparkSQL簡介一、Hive簡介Hive的應(yīng)用場景-Hive的優(yōu)勢解決了傳統(tǒng)關(guān)系數(shù)據(jù)庫在大數(shù)據(jù)處理上的瓶頸。適合大數(shù)據(jù)的批量處理。充分利用集群的CPU計算資源、存儲資源,實(shí)現(xiàn)并行計算。Hive支持標(biāo)準(zhǔn)SQL語法,免去了編寫MR程序的過程,減少了開發(fā)成本。具有良好的擴(kuò)展性,拓展功能方便。Hive的應(yīng)用場景-Hive的優(yōu)勢Hive的優(yōu)勢-上百行MR程序與一條HQL的對比Hive的優(yōu)勢-上百行MR程序與一條HQL的對比Hive的應(yīng)用場景-Hive的缺點(diǎn)Hive的HQL表達(dá)能力有限:有些復(fù)雜運(yùn)算用HQL不易表達(dá)。Hive效率低:Hive自動生成MR作業(yè),通常不夠智能;HQL調(diào)優(yōu)困難,粒度較粗;可控性差。針對Hive運(yùn)行效率低下的問題,促使人們?nèi)ふ乙环N更快,更具交互性的分析框架。SparkSQL的出現(xiàn)則有效的提高了Sql在Hadoop上的分析運(yùn)行效率。Hive的應(yīng)用場景-Hive的缺點(diǎn)Hive的HQL表達(dá)能力有Hive的應(yīng)用場景適用場景海量數(shù)據(jù)的存儲處理數(shù)據(jù)挖掘海量數(shù)據(jù)的離線分析不適用場景復(fù)雜的機(jī)器學(xué)習(xí)算法復(fù)雜的科學(xué)計算聯(lián)機(jī)交互式實(shí)時查詢Hive的應(yīng)用場景適用場景一、Hive簡介二、Hive體系結(jié)構(gòu)三、Hive工作機(jī)制四、Hive應(yīng)用場景五、Hive安裝部署六、Hive開發(fā)使用七、SparkSQL簡介一、Hive簡介一、Hive簡介二、Hive體系結(jié)構(gòu)三、Hive工作機(jī)制四、Hive應(yīng)用場景五、Hive安裝部署六、Hive開發(fā)使用七、SparkSQL簡介一、Hive簡介Hive開發(fā)使用-Hive的連接HiveServer2目前Hive的Thrift服務(wù)端通常使用HiveServer2,它是HiveServer改進(jìn)版本,它提供了新的ThriftAPI來處理JDBC或者ODBC客戶端,可以進(jìn)行Kerberos身份驗(yàn)證,支持多個客戶端并發(fā)。BeeLineHiveServer2還提供了新的CLI:BeeLine,它是Hive0.11引入的新的交互式CLI,基于SQLLine,可以作為HiveJDBCClient端訪問HievServer2。通過BeeLine連接hivehive安裝目錄/bin/./beeline-ujdbc:hive2://hiveServer2所在ip:端口號-n用戶名例如:./beeline-ujdbc:hive2://127.0.0.1:10000-nrootHive開發(fā)使用-Hive的連接HiveServer2Hive開發(fā)使用-Hive的基本數(shù)據(jù)類型Hive開發(fā)使用-Hive的基本數(shù)據(jù)類型Hive開發(fā)使用-Hive的復(fù)雜數(shù)據(jù)類型Hive開發(fā)使用-Hive的復(fù)雜數(shù)據(jù)類型Hive開發(fā)使用-Hive元數(shù)據(jù)庫表簡介Hive開發(fā)使用-Hive元數(shù)據(jù)庫表簡介Hive開發(fā)使用-Hive的數(shù)據(jù)模型Hive數(shù)據(jù)庫類似傳統(tǒng)數(shù)據(jù)庫的DataBase,在元數(shù)據(jù)庫里實(shí)際是一張表。對應(yīng)于HDFS上的數(shù)據(jù)倉庫目錄下是一個文件夾。數(shù)據(jù)倉庫目錄路徑,由hive-site.xml中${hive.metastore.warehouse.dir}參數(shù)指定。創(chuàng)建數(shù)據(jù)庫示例:createdatabase數(shù)據(jù)庫名;元數(shù)據(jù)庫中查詢數(shù)據(jù)庫列表:select*fromdbs;如下圖:Hive開發(fā)使用-Hive的數(shù)據(jù)模型Hive數(shù)據(jù)庫Hive開發(fā)使用-Hive的數(shù)據(jù)模型Hive數(shù)據(jù)庫
hive-site.xml中的數(shù)據(jù)倉庫目錄設(shè)置,如下圖:HDFS下對應(yīng)存儲目錄,數(shù)據(jù)庫名后綴為.db的數(shù)據(jù)庫列表,如下圖,Hive開發(fā)使用-Hive的數(shù)據(jù)模型Hive數(shù)據(jù)庫HDFS下Hive開發(fā)使用-Hive的數(shù)據(jù)模型內(nèi)部表
內(nèi)部表與關(guān)系數(shù)據(jù)庫中的Table在概念上類似。每一個Table在Hive中都有一個相應(yīng)的目錄存儲數(shù)據(jù)。所有的Table數(shù)據(jù)(不包括ExternalTable)都保存在這個目錄中。刪除表時,元數(shù)據(jù)與數(shù)據(jù)都會被刪除。元數(shù)據(jù)庫中查詢數(shù)據(jù)表列表:
HDFS下對應(yīng)存儲目錄:Hive開發(fā)使用-Hive的數(shù)據(jù)模型元數(shù)據(jù)庫中查詢數(shù)據(jù)表列表Hive開發(fā)使用-Hive的數(shù)據(jù)模型
外部表
外部表指向已經(jīng)在HDFS中存在的數(shù)據(jù),可以創(chuàng)建Partition。它和內(nèi)部表在元數(shù)據(jù)的組織上是相同的,而實(shí)際數(shù)據(jù)的存儲則有較大的差異。內(nèi)部表的創(chuàng)建過程和數(shù)據(jù)加載過程這兩個過程可以分別獨(dú)立完成,也可以在同一個語句中完成,在加載數(shù)據(jù)的過程中,實(shí)際數(shù)據(jù)會被移動到數(shù)據(jù)倉庫目錄中;之后對數(shù)據(jù)訪問將會直接在數(shù)據(jù)倉庫目錄中完成。刪除表時,表中的數(shù)據(jù)和元數(shù)據(jù)將會被同時刪除。而外部表只有一個過程,加載數(shù)據(jù)和創(chuàng)建表同時完成(CREATEEXTERNALTABLE……LOCATION),實(shí)際數(shù)據(jù)是存儲在LOCATION后面指定的HDFS路徑中,并不會移動到數(shù)據(jù)倉庫目錄中。當(dāng)刪除一個ExternalTable時,僅刪除該鏈接。Hive開發(fā)使用-Hive的數(shù)據(jù)模型Hive開發(fā)使用-Hive的數(shù)據(jù)模型如何選擇使用內(nèi)部表或外部表?如果所有處理都由hive來完成,則使用內(nèi)部表如果需要用hive和外部其他工具處理同一組數(shù)據(jù)集,則使用外部表。Hive開發(fā)使用-Hive的數(shù)據(jù)模型如何選擇使用內(nèi)部表或外部Hive開發(fā)使用-Hive的數(shù)據(jù)模型
分區(qū)
Partition對應(yīng)于關(guān)系數(shù)據(jù)庫中的Partition列的密集索引,但是Hive中Partition的組織方式和數(shù)據(jù)庫中的很不相同。在Hive中,表中的一個Partition對應(yīng)于表下的一個目錄,所有的Partition的數(shù)據(jù)都存儲在對應(yīng)的目錄中。例如pvs表中包含ds和city兩個Partition,則對應(yīng)于ds=20090801,city=jinan的HDFS子目錄為:/wh/pvs/ds=20090801/city=jinan;對應(yīng)于ds=20090801,city=qingdao的HDFS子目錄為:/wh/pvs/ds=20090801/city=qingdao。Hive開發(fā)使用-Hive的數(shù)據(jù)模型Hive開發(fā)使用-Hive的數(shù)據(jù)模型
桶
Buckets是將表的列通過Hash算法進(jìn)一步分解成不同的文件存儲。它對指定列計算hash,根據(jù)hash值切分?jǐn)?shù)據(jù),目的是為了并行,每一個Bucket對應(yīng)一個文件。分區(qū)是粗粒度的劃分,桶是細(xì)粒度的劃分,這樣做為了可以讓查詢發(fā)生在小范圍的數(shù)據(jù)上以提高效率。適合進(jìn)行表連接查詢、適合用于采樣分析。例如將user列分散至32個bucket,首先對user列的值計算hash,則對應(yīng)hash值為0的HDFS目錄為:/wh/pvs/ds=20090801/ctry=US/part-00000;對應(yīng)hash值為20的HDFS目錄為:/wh/pvs/ds=20090801/ctry=US/part-00020。如果想應(yīng)用很多的Map任務(wù)這樣是不錯的選擇。Hive開發(fā)使用-Hive的數(shù)據(jù)模型Hive開發(fā)使用-Hive的數(shù)據(jù)模型
Hive的視圖視圖與傳統(tǒng)數(shù)據(jù)庫的視圖類似。視圖是只讀的,它基于的基本表,如果改變,數(shù)據(jù)增加不會影響視圖的呈現(xiàn);如果刪除,會出現(xiàn)問題。如果不指定視圖的列,會根據(jù)select語句后的生成。
視圖的簡單示例:創(chuàng)建表:createviewtest_viewasselect*fromtest;查看數(shù)據(jù):select*fromtest_view;Hive開發(fā)使用-Hive的數(shù)據(jù)模型Hive開發(fā)使用-Hive的數(shù)據(jù)存儲模型數(shù)據(jù)庫(database)表(table)表(table)常規(guī)數(shù)據(jù)(data)(Buckets)桶(Buckets)桶分區(qū)(Partition)分區(qū)(Partition)(Buckets)桶(Buckets)桶Hive開發(fā)使用-Hive的數(shù)據(jù)存儲模型數(shù)據(jù)庫表表常規(guī)數(shù)據(jù)分Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令CREATETABLE創(chuàng)建一個指定名字的表。如果相同名字的表已經(jīng)存在,則拋出異常;用戶可以用IFNOTEXIST選項(xiàng)來忽略這個異常。EXTERNAL關(guān)鍵字可以讓用戶創(chuàng)建一個外部表,在建表的同時指定一個指向?qū)嶋H數(shù)據(jù)的路徑(LOCATION),有分區(qū)的表可以在創(chuàng)建的時候使用PARTITIONEDBY語句。一個表可以擁有一個或者多個分區(qū),每一個分區(qū)單獨(dú)存在一個目錄下。表和分區(qū)都可以對某個列進(jìn)行CLUSTEREDBY操作,將若干個列放入一個桶(bucket)中??梢岳肧ORTBY對數(shù)據(jù)進(jìn)行排序。這樣可以為特定應(yīng)用提高性能。默認(rèn)的字段分隔符為ascii碼的控制符\001(^A)tab分隔符為\t。只支持單個字符的分隔符。如果文件數(shù)據(jù)是純文本,可以使用STOREDASTEXTFILE。如果數(shù)據(jù)需要壓縮,使用STOREDASSEQUENCE。CREATE[EXTERNAL]TABLE[IFNOTEXISTS]table_name
[(col_namedata_type[COMMENTcol_comment],...)][COMMENTtable_comment]
[PARTITIONEDBY(col_namedata_type[COMMENTcol_comment],...)]
[CLUSTEREDBY(col_name,col_name,...)[SORTEDBY(col_name[ASC|DESC],...)]INTOnum_bucketsBUCKETS]
[ROWFORMATrow_format]
[STOREDASfile_format][LOCATIONhdfs_path]Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令CREATETABHive開發(fā)使用-Hive加載數(shù)據(jù)命令Load操作只是單純的復(fù)制/移動操作,將數(shù)據(jù)文件移動到Hive表對應(yīng)的位置。如果表中存在分區(qū),則必須指定分區(qū)名。加載本地數(shù)據(jù),指定LOCAL關(guān)鍵字,即本地,可以同時給定分區(qū)信息。load命令會去查找本地文件系統(tǒng)中的filepath。如果發(fā)現(xiàn)是相對路徑,則路徑會被解釋為相對于當(dāng)前用戶的當(dāng)前路徑。用戶也可以為本地文件指定一個完整的URI,比如:file:///user/hive/project/data1.例如:加載本地數(shù)據(jù),同時給定分區(qū)信息:hive>LOADDATALOCALINPATH'file:///examples/files/kv2.txt'OVERWRITEINTOTABLEinvitesPARTITION(ds='2008-08-15');加載DFS數(shù)據(jù),同時給定分區(qū)信息:如果filepath可以是相對路徑URI路徑,對于相對路徑,Hive會使用在hadoop配置文件中定義的fs.defaultFS指定的Namenode的URI來自動拼接完整路徑。例如
:加載數(shù)據(jù)到hdfs中,同時給定分區(qū)信息hive>LOADDATAINPATH'/user/myname/kv2.txt'OVERWRITEINTOTABLEinvitesPARTITION(ds='2008-08-15');OVERWRITE指定OVERWRITE,目標(biāo)表(或者分區(qū))中的內(nèi)容(如果有)會被刪除,然后再將filepath指向的文件/目錄中的內(nèi)容添加到表/分區(qū)中。如果目標(biāo)表(分區(qū))已經(jīng)有一個文件,并且文件名和filepath中的文件名沖突,那么現(xiàn)有的文件會被新文件所替代。LOADDATA[LOCAL]INPATH'filepath'[OVERWRITE]INTOTABLEtablename[PARTITION(partcol1=val1,partcol2=val2...)]Hive開發(fā)使用-Hive加載數(shù)據(jù)命令Load操作只是單純Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例內(nèi)部表
例如:創(chuàng)建人員信息表person_inside,列以逗號","分隔。
建表示例:createtableperson_inside(idstring,namestring,sexstring,ageint)rowformatdelimitedfieldsterminatedby','storedastextfile;加載數(shù)據(jù):本地數(shù)據(jù)位置:/tmp/person.txtloaddatalocalinpath'file:///tmp/person.txt'intotableperson_inside;Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例外部表
例如:創(chuàng)建人員信息表person_ex,列以逗號","分隔。外部表對應(yīng)路徑:hdfs://mycluster/hivedb/person.txt
建表示例:createexternaltableperson_ext(idstring,namestring,sexstring,ageint)rowformatdelimitedfieldsterminatedby','storedastextfilelocation'/hivedb';(注意:location后面跟的是目錄,不是文件,hive將依據(jù)默認(rèn)配置的hdfs路徑,自動將整個目錄下的文件都加載到表中)Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例外部表
hive默認(rèn)數(shù)據(jù)倉庫路徑下,不會生成外部表的文件目錄,如下圖:查看表信息:descformattedperson_ext;查看location指向。如下圖:Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例查看表信息:dHive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例外部表
查詢數(shù)據(jù):select*fromperson_ext;刪除表:droptableperson_ext;只刪除邏輯表,不刪除數(shù)據(jù)文件,數(shù)據(jù)文件依然存在。如下圖:Hive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例查詢數(shù)據(jù):selHive開發(fā)使用-Hive創(chuàng)建數(shù)據(jù)表命令示例分區(qū)表
例如:創(chuàng)建人員信息表person_part,列以逗號","分隔。建立city為分區(qū)。建表示例:createtableperso
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 畢業(yè)生代表發(fā)言稿10篇
- 質(zhì)檢員個人工作總結(jié)模板5篇
- 住宅小區(qū)智能化施工合同
- 游樂園保潔員招聘合同
- 搶椅子的教案反思5篇
- 居民社區(qū)籃球場翻新工程協(xié)議
- 2024年快速離婚協(xié)議書:簡化流程的離婚協(xié)議書
- 生物質(zhì)能源項(xiàng)目電子招投標(biāo)規(guī)則
- 花卉種植散水施工協(xié)議
- 講文明講話稿材料5篇
- 2024建筑門窗安裝技術(shù)規(guī)程
- 降低會陰側(cè)切率的PDCA
- 第二篇創(chuàng)業(yè)機(jī)會的識別課件
- 2023年江蘇省無錫錫山區(qū)市場監(jiān)督管理局招聘11人筆試參考題庫(共500題)答案詳解版
- 《危機(jī)概述》課件
- 浙江省寧波市鎮(zhèn)海區(qū)蛟川書院2023-2024學(xué)年九年級上學(xué)期期中科學(xué)試卷
- 54設(shè)計和開發(fā)驗(yàn)證記錄表
- 2023年新改版教科版四年級上冊科學(xué)期中測試卷 (超全)
- 二上【教學(xué)】《我們不亂扔》
- 研發(fā)流程(EVT-DVT-PVT-MP)實(shí)用文檔
- 班子成員“一崗雙責(zé)”責(zé)任清單
評論
0/150
提交評論