大數(shù)據(jù)系列Hive入門(mén)與實(shí)戰(zhàn)_第1頁(yè)
大數(shù)據(jù)系列Hive入門(mén)與實(shí)戰(zhàn)_第2頁(yè)
大數(shù)據(jù)系列Hive入門(mén)與實(shí)戰(zhàn)_第3頁(yè)
大數(shù)據(jù)系列Hive入門(mén)與實(shí)戰(zhàn)_第4頁(yè)
大數(shù)據(jù)系列Hive入門(mén)與實(shí)戰(zhàn)_第5頁(yè)
已閱讀5頁(yè),還剩64頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

大數(shù)據(jù)系列-Hive入門(mén)與實(shí)戰(zhàn)一、Hive簡(jiǎn)介二、Hive體系構(gòu)造三、Hive任務(wù)機(jī)制四、Hive運(yùn)用場(chǎng)景五、Hive安裝部署六、Hive開(kāi)發(fā)運(yùn)用七、SparkSQL簡(jiǎn)介Hive簡(jiǎn)介-Hive是什么?Hive是構(gòu)建在Hadoop之上的數(shù)據(jù)倉(cāng)庫(kù)平臺(tái)Hive是一個(gè)SQL解析引擎,它將SQL語(yǔ)句轉(zhuǎn)譯成MapReduce作業(yè)并在Hadoop上執(zhí)行。Hive表是HDFS的一個(gè)文件目錄,一個(gè)表名對(duì)應(yīng)一個(gè)目錄名,假設(shè)有分區(qū)表的話(huà),那么分區(qū)值對(duì)應(yīng)子目錄名。Hive簡(jiǎn)介-Hive的歷史由來(lái)Hive是Facebook開(kāi)發(fā)的,構(gòu)建于Hadoop集群之上的數(shù)據(jù)倉(cāng)庫(kù)運(yùn)用。2021年Facebook將Hive工程奉獻(xiàn)給Apache,成為開(kāi)源工程。目前最新版本hive-2.0.0Hive簡(jiǎn)介-Hive的歷史由來(lái)Hadoop和Hive組建成為Facebook數(shù)據(jù)倉(cāng)庫(kù)的開(kāi)展史隨著數(shù)據(jù)量添加某些查詢(xún)需求幾個(gè)小時(shí)甚至幾天才干完成。當(dāng)數(shù)據(jù)到達(dá)1T時(shí),MySql進(jìn)程跨掉??梢灾螏讉€(gè)T的數(shù)據(jù),但每天搜集用戶(hù)點(diǎn)擊流數(shù)據(jù)〔每天約400G〕時(shí),Oracle開(kāi)場(chǎng)撐不住。有效處理了大規(guī)模數(shù)據(jù)的存儲(chǔ)與統(tǒng)計(jì)分析的問(wèn)題,但是MapReduce程序?qū)τ谄胀ǚ治鋈藛T的運(yùn)用過(guò)于復(fù)雜和繁瑣。對(duì)外提供了類(lèi)似于SQL語(yǔ)法的HQL語(yǔ)句數(shù)據(jù)接口,自動(dòng)將HQL語(yǔ)句編譯轉(zhuǎn)化為MR作業(yè)后在Hadoop上執(zhí)行。降低了分析人員運(yùn)用Hadoop進(jìn)展數(shù)據(jù)分析的難度。一、Hive簡(jiǎn)介二、Hive體系構(gòu)造三、Hive任務(wù)機(jī)制四、Hive運(yùn)用場(chǎng)景五、Hive安裝部署六、Hive開(kāi)發(fā)運(yùn)用七、SparkSQL簡(jiǎn)介Hive體系構(gòu)造-Hive在Hadoop中的位置Avro(序列化)Zookeeper(協(xié)調(diào)效力)Pig(數(shù)據(jù)流)SqoopHive(SQL)MapReduce(分布式計(jì)算框架)Hbase(列存儲(chǔ))HCatalog(元數(shù)據(jù))HDFS(Hadoop分布式文件系統(tǒng))程序文語(yǔ)計(jì)算表存儲(chǔ)對(duì)象存儲(chǔ)Hive體系構(gòu)造-Hive設(shè)計(jì)特征Hive做為Hadoop的數(shù)據(jù)倉(cāng)庫(kù)處置工具,它一切的數(shù)據(jù)都存儲(chǔ)在Hadoop兼容的文件系統(tǒng)中。Hive在加載數(shù)據(jù)過(guò)程中不會(huì)對(duì)數(shù)據(jù)進(jìn)展任何的修正,只是將數(shù)據(jù)挪動(dòng)到HDFS中Hive設(shè)定的目錄下,因此,Hive不支持對(duì)數(shù)據(jù)的改寫(xiě)和添加,一切的數(shù)據(jù)都是在加載的時(shí)候確定的。Hive的設(shè)計(jì)特點(diǎn)如下。支持索引,加快數(shù)據(jù)查詢(xún)。不同的存儲(chǔ)類(lèi)型,例如,純文本文件、HBase中的文件。將元數(shù)據(jù)保管在關(guān)系數(shù)據(jù)庫(kù)中,減少了在查詢(xún)中執(zhí)行語(yǔ)義檢查時(shí)間??梢灾苯舆\(yùn)用存儲(chǔ)在Hadoop文件系統(tǒng)中的數(shù)據(jù)。內(nèi)置大量用戶(hù)函數(shù)UDF來(lái)操作時(shí)間、字符串和其他的數(shù)據(jù)發(fā)掘工具,支持用戶(hù)擴(kuò)展UDF函數(shù)來(lái)完成內(nèi)置函數(shù)無(wú)法實(shí)現(xiàn)的操作。類(lèi)SQL的查詢(xún)方式,將SQL查詢(xún)轉(zhuǎn)換為MapReduce的job在Hadoop集群上執(zhí)行。編碼跟Hadoop同樣運(yùn)用UTF-8字符集。Hive體系構(gòu)造用戶(hù)接口CLI:Cli啟動(dòng)的時(shí)候,會(huì)同時(shí)啟動(dòng)一個(gè)Hive副本。JDBC客戶(hù)端:封裝了Thrift,java運(yùn)用程序,可以經(jīng)過(guò)指定的主機(jī)和端口銜接到在另一個(gè)進(jìn)程中運(yùn)轉(zhuǎn)的hive效力器ODBC客戶(hù)端:ODBC驅(qū)動(dòng)允許支持ODBC協(xié)議的運(yùn)用程序銜接到Hive。WUI接口:是經(jīng)過(guò)閱讀器訪(fǎng)問(wèn)HiveThrift效力器基于socket通訊,支持跨言語(yǔ)。HiveThrift效力簡(jiǎn)化了在多編程言語(yǔ)中運(yùn)轉(zhuǎn)Hive的命令。綁定支持C++,Java,PHP,Python和Ruby言語(yǔ)。HiveHadoopThrift效力器解析器編譯器優(yōu)化器執(zhí)行器元數(shù)據(jù)庫(kù)MapReduceHDFS數(shù)據(jù)倉(cāng)庫(kù)用戶(hù)接口CLI接口JDBC/ODBC客戶(hù)端WEB接口Hive體系構(gòu)造解析器編譯器:完成HQL語(yǔ)句從詞法分析、語(yǔ)法分析、編譯、優(yōu)化以及執(zhí)行方案的生成。優(yōu)化器是一個(gè)演化組件,當(dāng)前它的規(guī)那么是:列修剪,謂詞下壓。執(zhí)行器會(huì)順序執(zhí)行一切的Job。假設(shè)Task鏈不存在依賴(lài)關(guān)系,可以采用并發(fā)執(zhí)行的方式執(zhí)行Job。元數(shù)據(jù)庫(kù)Hive的數(shù)據(jù)由兩部分組成:數(shù)據(jù)文件和元數(shù)據(jù)。元數(shù)據(jù)用于存放Hive庫(kù)的根底信息,它存儲(chǔ)在關(guān)系數(shù)據(jù)庫(kù)中,如mysql、derby。元數(shù)據(jù)包括:數(shù)據(jù)庫(kù)信息、表的名字,表的列和分區(qū)及其屬性,表的屬性,表的數(shù)據(jù)所在目錄等。HadoopHive的數(shù)據(jù)文件存儲(chǔ)在HDFS中,大部分的查詢(xún)由MapReduce完成?!矊?duì)于包含*的查詢(xún),比如select*fromtbl不會(huì)生成MapRedcue作業(yè)〕HiveHadoopThrift效力器解析器編譯器優(yōu)化器執(zhí)行器元數(shù)據(jù)庫(kù)MapReduceHDFS數(shù)據(jù)倉(cāng)庫(kù)用戶(hù)接口CLI接口JDBC/ODBC客戶(hù)端WEB接口一、Hive簡(jiǎn)介二、Hive體系構(gòu)造三、Hive任務(wù)機(jī)制四、Hive運(yùn)用場(chǎng)景五、Hive安裝部署六、Hive開(kāi)發(fā)運(yùn)用七、SparkSQL簡(jiǎn)介HadoopHive的運(yùn)轉(zhuǎn)機(jī)制hive用戶(hù)經(jīng)過(guò)用戶(hù)接口銜接Hive,發(fā)布HiveSQLHive解析查詢(xún)并制定查詢(xún)方案Hive將查詢(xún)轉(zhuǎn)換成MapReduce作業(yè)Hive在Hadoop上執(zhí)行MapReduce作業(yè)sqlMap/Reducehdfstable1table2table3......用戶(hù)用戶(hù)接口1234Hive編譯器的運(yùn)轉(zhuǎn)機(jī)制〔Hive的中心〕語(yǔ)義解析器將查詢(xún)字符串轉(zhuǎn)換成解析樹(shù)表達(dá)式。語(yǔ)法解析器將解析樹(shù)轉(zhuǎn)換成基于語(yǔ)句塊的內(nèi)部查詢(xún)表達(dá)式。邏輯方案生成器將內(nèi)部查詢(xún)表達(dá)式轉(zhuǎn)換為邏輯方案,這些方案由邏輯操作樹(shù)組成,操作符是Hive的最小處置單元,每個(gè)操作符處置代表一道HDFS操作或者是MR作業(yè)。查詢(xún)方案生成器將邏輯方案轉(zhuǎn)化成物理方案〔MRJob〕。一、Hive簡(jiǎn)介二、Hive體系構(gòu)造三、Hive任務(wù)機(jī)制四、Hive運(yùn)用場(chǎng)景五、Hive安裝部署六、Hive開(kāi)發(fā)運(yùn)用七、SparkSQL簡(jiǎn)介Hive的運(yùn)用場(chǎng)景-Hive的優(yōu)勢(shì)處理了傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)在大數(shù)據(jù)處置上的瓶頸。適宜大數(shù)據(jù)的批量處置。充分利用集群的CPU計(jì)算資源、存儲(chǔ)資源,實(shí)現(xiàn)并行計(jì)算。Hive支持規(guī)范SQL語(yǔ)法,免去了編寫(xiě)MR程序的過(guò)程,減少了開(kāi)發(fā)本錢(qián)。具有良好的擴(kuò)展性,拓展功能方便。Hive的優(yōu)勢(shì)-上百行MR程序與一條HQL的對(duì)比Hive的運(yùn)用場(chǎng)景-Hive的缺陷Hive的HQL表達(dá)才干有限:有些復(fù)雜運(yùn)算用HQL不易表達(dá)。Hive效率低:Hive自動(dòng)生成MR作業(yè),通常不夠智能;HQL調(diào)優(yōu)困難,粒度較粗;可控性差。針對(duì)Hive運(yùn)轉(zhuǎn)效率低下的問(wèn)題,促使人們?nèi)ひ捯环N更快,更具交互性的分析框架。SparkSQL的出現(xiàn)那么有效的提高了Sql在Hadoop上的分析運(yùn)轉(zhuǎn)效率。Hive的運(yùn)用場(chǎng)景適用場(chǎng)景海量數(shù)據(jù)的存儲(chǔ)處置數(shù)據(jù)發(fā)掘海量數(shù)據(jù)的離線(xiàn)分析不適用場(chǎng)景復(fù)雜的機(jī)器學(xué)習(xí)算法復(fù)雜的科學(xué)計(jì)算聯(lián)機(jī)交互式實(shí)時(shí)查詢(xún)一、Hive簡(jiǎn)介二、Hive體系構(gòu)造三、Hive任務(wù)機(jī)制四、Hive運(yùn)用場(chǎng)景五、Hive安裝部署六、Hive開(kāi)發(fā)運(yùn)用七、SparkSQL簡(jiǎn)介一、Hive簡(jiǎn)介二、Hive體系構(gòu)造三、Hive任務(wù)機(jī)制四、Hive運(yùn)用場(chǎng)景五、Hive安裝部署六、Hive開(kāi)發(fā)運(yùn)用七、SparkSQL簡(jiǎn)介Hive開(kāi)發(fā)運(yùn)用-Hive的銜接HiveServer2目前Hive的Thrift效力端通常運(yùn)用HiveServer2,它是HiveServer改良版本,它提供了新的ThriftAPI來(lái)處置JDBC或者ODBC客戶(hù)端,可以進(jìn)展Kerberos身份驗(yàn)證,支持多個(gè)客戶(hù)端并發(fā)。BeeLineHiveServer2還提供了新的CLI:BeeLine,它是Hive0.11引入的新的交互式CLI,基于SQLLine,可以作為HiveJDBCClient端訪(fǎng)問(wèn)HievServer2。經(jīng)過(guò)BeeLine銜接hivehive安裝目錄/bin/./beeline-ujdbc:hive2hiveServer2所在ip:端口號(hào)-n用戶(hù)名例如:./beeline-ujdbc:hive2127.0.0.1:10000-nrootHive開(kāi)發(fā)運(yùn)用-Hive的根本數(shù)據(jù)類(lèi)型基本類(lèi)型大小描述TINYINT1個(gè)字節(jié)有符號(hào)整數(shù)SMALLINT2個(gè)字節(jié)有符號(hào)整數(shù)INT4個(gè)字節(jié)有符號(hào)整數(shù)BIGINT8個(gè)字節(jié)有符號(hào)整數(shù)STRING最大2GB字符串,類(lèi)似SQL中的VARCHAR類(lèi)型FLOAT4個(gè)字節(jié)單精度浮點(diǎn)型DOUBLE8個(gè)字節(jié)雙精度浮點(diǎn)型BOOLEAN~TRUE/FALSEHive開(kāi)發(fā)運(yùn)用-Hive的復(fù)雜數(shù)據(jù)類(lèi)型Hive開(kāi)發(fā)運(yùn)用-Hive元數(shù)據(jù)庫(kù)表簡(jiǎn)介表名說(shuō)明關(guān)聯(lián)鍵DBS元數(shù)據(jù)庫(kù)信息,存放HDFS路徑信息DB_IDTBLS所有hive表的基本信息TBL_ID,SD_ID,DB_IDTABLE_PARAM表級(jí)屬性,如是否外部表,表注釋等TBL_IDCOLUMNS_V2Hive表字段信息(字段注釋?zhuān)侄蚊侄晤?lèi)型,字段序號(hào))CD_IDSDS所有hive表、表分區(qū)所對(duì)應(yīng)的hdfs數(shù)據(jù)目錄和數(shù)據(jù)格式SD_ID,SERDE_IDSERDESHive表的序列化類(lèi)型SERDE_IDSERDE_PARAM序列化反序列化信息,如行分隔符、列分隔符、NULL的表示字符等SERDE_IDPARTITIONSHive表分區(qū)信息PART_ID,SD_ID,TBL_IDPARTITION_KEYSHive分區(qū)表分區(qū)鍵TBL_IDPARTITION_KEY_VALSHive表分區(qū)名(鍵值)PART_IDSEQUENCE_TABLE保存Hive對(duì)象的下一個(gè)可用ID,包括數(shù)據(jù)庫(kù),表,字段,分區(qū)等對(duì)象的下一個(gè)ID。默認(rèn)ID每次+5SEQUENCE_NAME,NEXT_VALHive開(kāi)發(fā)運(yùn)用-Hive的數(shù)據(jù)模型Hive數(shù)據(jù)庫(kù)類(lèi)似傳統(tǒng)數(shù)據(jù)庫(kù)的DataBase,在元數(shù)據(jù)庫(kù)里實(shí)踐是一張表。對(duì)應(yīng)于HDFS上的數(shù)據(jù)倉(cāng)庫(kù)目錄下是一個(gè)文件夾。數(shù)據(jù)倉(cāng)庫(kù)目錄途徑,由hive-site.xml中${hive.metastore.warehouse.dir}參數(shù)指定。創(chuàng)建數(shù)據(jù)庫(kù)例如:createdatabase數(shù)據(jù)庫(kù)名;元數(shù)據(jù)庫(kù)中查詢(xún)數(shù)據(jù)庫(kù)列表:select*fromdbs;如以下圖:Hive開(kāi)發(fā)運(yùn)用-Hive的數(shù)據(jù)模型Hive數(shù)據(jù)庫(kù)hive-site.xml中的數(shù)據(jù)倉(cāng)庫(kù)目錄設(shè)置,如以下圖:HDFS下對(duì)應(yīng)存儲(chǔ)目錄,數(shù)據(jù)庫(kù)名后綴為.db的數(shù)據(jù)庫(kù)列表,如以下圖,Hive開(kāi)發(fā)運(yùn)用-Hive的數(shù)據(jù)模型內(nèi)部表內(nèi)部表與關(guān)系數(shù)據(jù)庫(kù)中的Table在概念上類(lèi)似。每一個(gè)Table在Hive中都有一個(gè)相應(yīng)的目錄存儲(chǔ)數(shù)據(jù)。一切的Table數(shù)據(jù)〔不包括ExternalTable〕都保管在這個(gè)目錄中。刪除表時(shí),元數(shù)據(jù)與數(shù)據(jù)都會(huì)被刪除。元數(shù)據(jù)庫(kù)中查詢(xún)數(shù)據(jù)表列表:HDFS下對(duì)應(yīng)存儲(chǔ)目錄:Hive開(kāi)發(fā)運(yùn)用-Hive的數(shù)據(jù)模型

外部表外部表指向曾經(jīng)在HDFS中存在的數(shù)據(jù),可以創(chuàng)建Partition。它和內(nèi)部表在元數(shù)據(jù)的組織上是一樣的,而實(shí)踐數(shù)據(jù)的存儲(chǔ)那么有較大的差別。內(nèi)部表的創(chuàng)建過(guò)程和數(shù)據(jù)加載過(guò)程這兩個(gè)過(guò)程可以分別獨(dú)立完成,也可以在同一個(gè)語(yǔ)句中完成,在加載數(shù)據(jù)的過(guò)程中,實(shí)踐數(shù)據(jù)會(huì)被挪動(dòng)到數(shù)據(jù)倉(cāng)庫(kù)目錄中;之后對(duì)數(shù)據(jù)訪(fǎng)問(wèn)將會(huì)直接在數(shù)據(jù)倉(cāng)庫(kù)目錄中完成。刪除表時(shí),表中的數(shù)據(jù)和元數(shù)據(jù)將會(huì)被同時(shí)刪除。而外部表只需一個(gè)過(guò)程,加載數(shù)據(jù)和創(chuàng)建表同時(shí)完成〔CREATEEXTERNALTABLE……LOCATION〕,實(shí)踐數(shù)據(jù)是存儲(chǔ)在LOCATION后面指定的HDFS途徑中,并不會(huì)挪動(dòng)到數(shù)據(jù)倉(cāng)庫(kù)目錄中。當(dāng)刪除一個(gè)ExternalTable時(shí),僅刪除該鏈接。Hive開(kāi)發(fā)運(yùn)用-Hive的數(shù)據(jù)模型如何選擇運(yùn)用內(nèi)部表或外部表?假設(shè)一切處置都由hive來(lái)完成,那么運(yùn)用內(nèi)部表假設(shè)需求用hive和外部其他工具處置同一組數(shù)據(jù)集,那么運(yùn)用外部表。Hive開(kāi)發(fā)運(yùn)用-Hive的數(shù)據(jù)模型

分區(qū)Partition對(duì)應(yīng)于關(guān)系數(shù)據(jù)庫(kù)中的Partition列的密集索引,但是Hive中Partition的組織方式和數(shù)據(jù)庫(kù)中的很不一樣。在Hive中,表中的一個(gè)Partition對(duì)應(yīng)于表下的一個(gè)目錄,一切的Partition的數(shù)據(jù)都存儲(chǔ)在對(duì)應(yīng)的目錄中。例如pvs表中包含ds和city兩個(gè)Partition,那么對(duì)應(yīng)于ds=20210801,city=jinan的HDFS子目錄為:/wh/pvs/ds=20210801/city=jinan;對(duì)應(yīng)于ds=20210801,city=qingdao的HDFS子目錄為:/wh/pvs/ds=20210801/city=qingdao。Hive開(kāi)發(fā)運(yùn)用-Hive的數(shù)據(jù)模型

桶Buckets是將表的列經(jīng)過(guò)Hash算法進(jìn)一步分解成不同的文件存儲(chǔ)。它對(duì)指定列計(jì)算hash,根據(jù)hash值切分?jǐn)?shù)據(jù),目的是為了并行,每一個(gè)Bucket對(duì)應(yīng)一個(gè)文件。分區(qū)是粗粒度的劃分,桶是細(xì)粒度的劃分,這樣做為了可以讓查詢(xún)發(fā)生在小范圍的數(shù)據(jù)上以提高效率。適宜進(jìn)展表銜接查詢(xún)、適宜用于采樣分析。例如將user列分散至32個(gè)bucket,首先對(duì)user列的值計(jì)算hash,那么對(duì)應(yīng)hash值為0的HDFS目錄為:/wh/pvs/ds=20210801/ctry=US/part-00000;對(duì)應(yīng)hash值為20的HDFS目錄為:/wh/pvs/ds=20210801/ctry=US/part-00020。假設(shè)想運(yùn)用很多的Map義務(wù)這樣是不錯(cuò)的選擇。Hive開(kāi)發(fā)運(yùn)用-Hive的數(shù)據(jù)模型

Hive的視圖視圖與傳統(tǒng)數(shù)據(jù)庫(kù)的視圖類(lèi)似。視圖是只讀的,它基于的根本表,假設(shè)改動(dòng),數(shù)據(jù)添加不會(huì)影響視圖的呈現(xiàn);假設(shè)刪除,會(huì)出現(xiàn)問(wèn)題。假設(shè)不指定視圖的列,會(huì)根據(jù)select語(yǔ)句后的生成。

視圖的簡(jiǎn)單例如:創(chuàng)建表:createviewtest_viewasselect*fromtest;查看數(shù)據(jù):select*fromtest_view;Hive開(kāi)發(fā)運(yùn)用-Hive的數(shù)據(jù)存儲(chǔ)模型數(shù)據(jù)庫(kù)〔database〕表〔table〕表〔table〕常規(guī)數(shù)據(jù)〔data〕〔Buckets〕桶〔Buckets〕桶分區(qū)〔Partition〕分區(qū)〔Partition〕〔Buckets〕桶〔Buckets〕桶Hive開(kāi)發(fā)運(yùn)用-Hive創(chuàng)建數(shù)據(jù)表命令CREATETABLE創(chuàng)建一個(gè)指定名字的表。假設(shè)一樣名字的表曾經(jīng)存在,那么拋出異常;用戶(hù)可以用IFNOTEXIST選項(xiàng)來(lái)忽略這個(gè)異常。EXTERNAL關(guān)鍵字可以讓用戶(hù)創(chuàng)建一個(gè)外部表,在建表的同時(shí)指定一個(gè)指向?qū)嵺`數(shù)據(jù)的途徑〔LOCATION〕,有分區(qū)的表可以在創(chuàng)建的時(shí)候運(yùn)用PARTITIONEDBY語(yǔ)句。一個(gè)表可以擁有一個(gè)或者多個(gè)分區(qū),每一個(gè)分區(qū)單獨(dú)存在一個(gè)目錄下。表和分區(qū)都可以對(duì)某個(gè)列進(jìn)展CLUSTEREDBY操作,將假設(shè)干個(gè)列放入一個(gè)桶〔bucket〕中。可以利用SORTBY對(duì)數(shù)據(jù)進(jìn)展排序。這樣可以為特定運(yùn)用提高性能。默許的字段分隔符為ascii碼的控制符\001(^A)tab分隔符為\t。只支持單個(gè)字符的分隔符。假設(shè)文件數(shù)據(jù)是純文本,可以運(yùn)用STOREDASTEXTFILE。假設(shè)數(shù)據(jù)需求緊縮,運(yùn)用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開(kāi)發(fā)運(yùn)用-Hive加載數(shù)據(jù)命令Load操作只是單純的復(fù)制/挪動(dòng)操作,將數(shù)據(jù)文件挪動(dòng)到Hive表對(duì)應(yīng)的位置。假設(shè)表中存在分區(qū),那么必需指定分區(qū)名。加載本地?cái)?shù)據(jù),指定LOCAL關(guān)鍵字,即本地,可以同時(shí)給定分區(qū)信息。load命令會(huì)去查找本地文件系統(tǒng)中的filepath。假設(shè)發(fā)現(xiàn)是相對(duì)途徑,那么途徑會(huì)被解釋為相對(duì)于當(dāng)前用戶(hù)的當(dāng)出途徑。用戶(hù)也可以為本地文件指定一個(gè)完好的URI,比如:file/user/hive/project/data1.例如:加載本地?cái)?shù)據(jù),同時(shí)給定分區(qū)信息:hive>LOADDATALOCALINPATH'file/examples/files/kv2.txt'OVERWRITEINTOTABLEinvitesPARTITION(ds='2021-08-15');加載DFS數(shù)據(jù),同時(shí)給定分區(qū)信息:假設(shè)filepath可以是相對(duì)途徑URI途徑,對(duì)于相對(duì)途徑,Hive會(huì)運(yùn)用在hadoop配置文件中定義的fs.defaultFS指定的Namenode的URI來(lái)自動(dòng)拼接完好途徑。例如 :加載數(shù)據(jù)到hdfs中,同時(shí)給定分區(qū)信息hive>LOADDATAINPATH'/user/myname/kv2.txt'OVERWRITEINTOTABLEinvitesPARTITION(ds='2021-08-15');OVERWRITE指定OVERWRITE,目的表〔或者分區(qū)〕中的內(nèi)容〔假設(shè)有〕會(huì)被刪除,然后再將filepath指向的文件/目錄中的內(nèi)容添加到表/分區(qū)中。假設(shè)目的表〔分區(qū)〕曾經(jīng)有一個(gè)文件,并且文件名和filepath中的文件名沖突,那么現(xiàn)有的文件會(huì)被新文件所替代。LOADDATA[LOCAL]INPATH'filepath'[OVERWRITE]INTOTABLEtablename[PARTITION(partcol1=val1,partcol2=val2...)]Hive開(kāi)發(fā)運(yùn)用-Hive創(chuàng)建數(shù)據(jù)表命令例如內(nèi)部表例如:創(chuàng)建人員信息表person_inside,列以逗號(hào)","分隔。

建表例如:createtableperson_inside(idstring,namestring,sexstring,ageint)rowformatdelimitedfieldsterminatedby','storedastextfile;加載數(shù)據(jù):本地?cái)?shù)據(jù)位置:/tmp/person.txtloaddatalocalinpath'file/tmp/person.txt'intotableperson_inside;person表字段idnamesexage類(lèi)型stringstringstringintHive開(kāi)發(fā)運(yùn)用-Hive創(chuàng)建數(shù)據(jù)表命令例如外部表例如:創(chuàng)建人員信息表person_ex,列以逗號(hào)","分隔。外部表對(duì)應(yīng)途徑:hdfsmycluster/hivedb/person.txt建表例如:createexternaltableperson_ext(idstring,namestring,sexstring,ageint)rowformatdelimitedfieldsterminatedby','storedastextfilelocation'/hivedb';(留意:location后面跟的是目錄,不是文件,hive將根據(jù)默許配置的hdfs途徑,自動(dòng)將整個(gè)目錄下的文件都加載到表中)Hive開(kāi)發(fā)運(yùn)用-Hive創(chuàng)建數(shù)據(jù)表命令例如外部表hive默許數(shù)據(jù)倉(cāng)庫(kù)途徑下,不會(huì)生成外部表的文件目錄,如以下圖:查看表信息:descformattedperson_ext;查看location指向。如以下圖:Hive開(kāi)發(fā)運(yùn)用-Hive創(chuàng)建數(shù)據(jù)表命令例如外部表

查詢(xún)數(shù)據(jù):select*fromperson_ext;刪除表:droptableperson_ext;只刪除邏輯表,不刪除數(shù)據(jù)文件,數(shù)據(jù)文件依然存在。如以下圖:Hive開(kāi)發(fā)運(yùn)用-Hive創(chuàng)建數(shù)據(jù)表命令例如分區(qū)表例如:創(chuàng)建人員信息表person_part,列以逗號(hào)","分隔。建立city為分區(qū)。建表例如:createtableperson_part(idstring,namestring,sexstring,ageint)partitionedby(citystring)rowformatdelimitedfieldsterminatedby','storedastextfile;加載數(shù)據(jù):本地?cái)?shù)據(jù)位置:/tmp/person.txtloaddatalocalinpath'file/tmp/person.txt'intotableperson_partpartition(city='jinan');Hive開(kāi)發(fā)運(yùn)用-Hive創(chuàng)建數(shù)據(jù)表命令例如分區(qū)表數(shù)據(jù)存儲(chǔ)在以分區(qū)city='jinan'為目錄的途徑下,如以下圖:根據(jù)分區(qū)查詢(xún)數(shù)據(jù):hive會(huì)自動(dòng)判別where語(yǔ)句中能否包含分區(qū)的字段。而且可以運(yùn)用大于小于等運(yùn)算符select*fromperson_partwherecity='jinan';如以下圖:Hive開(kāi)發(fā)運(yùn)用-Hive創(chuàng)建數(shù)據(jù)表命令例如分桶表例如:創(chuàng)建人員信息表person_bucket,列以逗號(hào)","分隔,在年齡age字段上建5個(gè)桶。 建表例如: createtableperson_bucket (idstring,namestring,sexstring,ageint)partitionedby(citystring) clusteredby(age)sortedby(name)into5bucketsrowformatdelimitedfieldsterminatedby',' storedastextfile;翻開(kāi)桶參數(shù):sethive.enforce.bucketing=true;加載數(shù)據(jù):insertintotableperson_bucketpartition(city='jinan')select*fromperson_inside;

Hive開(kāi)發(fā)運(yùn)用-Hive創(chuàng)建數(shù)據(jù)表命令例如分桶表數(shù)據(jù)加載到桶表時(shí),會(huì)對(duì)字段取hash值,然后與桶的數(shù)量取模。把數(shù)據(jù)放到對(duì)應(yīng)的文件中。如以下圖:抽樣查詢(xún):查詢(xún)5個(gè)桶中的第2個(gè)桶,即000001_0文件select*fromperson_buckettablesample(bucket2outof5onage);Hive開(kāi)發(fā)運(yùn)用-Hive創(chuàng)建數(shù)據(jù)表命令例如分桶表:留意:要生成桶的數(shù)據(jù),只能是由其他表經(jīng)過(guò)insertinto或是insertoverwrite導(dǎo)入數(shù)據(jù),假設(shè)運(yùn)用LOADDATA加載數(shù)據(jù),那么不能生成桶數(shù)據(jù)。定義桶可以運(yùn)用整型字段或是string類(lèi)型字段。假設(shè)表沒(méi)有定義桶也可以進(jìn)展隨機(jī)抽樣,但是要全表掃描,速度慢。必需先sethive.enforce.bucketing=true,才可以將數(shù)據(jù)正常寫(xiě)入桶中。Hive開(kāi)發(fā)運(yùn)用-數(shù)據(jù)導(dǎo)出命令導(dǎo)出到本地文件系統(tǒng)insertoverwritelocaldirectory'/tmp/exportest/'select*fromperson_inside;留意:導(dǎo)出途徑為文件夾途徑,不用指定文件名。執(zhí)行語(yǔ)句后,會(huì)在本地目錄的/tmp/hivedb/下生成一個(gè)000000_0結(jié)果集數(shù)據(jù)文件。如以下圖:導(dǎo)出的數(shù)據(jù)列之間的分隔符默許是^A(ascii碼是\001)。如以下圖:Hive開(kāi)發(fā)運(yùn)用-數(shù)據(jù)導(dǎo)出命令導(dǎo)出到HDFS中insertoverwritedirectory'/hivedb'select*fromperson_inside;留意:導(dǎo)出途徑為文件夾途徑,不用指定文件名。執(zhí)行語(yǔ)句后,會(huì)在HDFS目錄的/hivedb下生成一個(gè)000000_0結(jié)果集數(shù)據(jù)文件。如以下圖:Hive開(kāi)發(fā)運(yùn)用-數(shù)據(jù)導(dǎo)出命令導(dǎo)出到Hive的另一個(gè)表中insertintotableperson_partpartition(city='jinan')select*fromperson_inside;Hive開(kāi)發(fā)運(yùn)用-數(shù)據(jù)查詢(xún)命令基于Partition的查詢(xún)例如:分區(qū)為citySELECT*FROMperson_partWHEREcity='jinan';限制條數(shù)查詢(xún)LIMITLimit可以限制查詢(xún)的記錄數(shù)。查詢(xún)的結(jié)果是隨機(jī)選擇的。下面的查詢(xún)語(yǔ)句從t1表中隨機(jī)查詢(xún)5條記錄:SELECT*FROMperson_insideLIMIT5;TopN查詢(xún)下面的查詢(xún)語(yǔ)句查詢(xún)年齡最大的5個(gè)人。setmapred.reduce.tasks=2;設(shè)置mapReduce義務(wù)數(shù)為2個(gè)select*fromperson_insidesortbyagedesclimit5;Hive開(kāi)發(fā)運(yùn)用-數(shù)據(jù)表銜接命令Hive只支持等值銜接,即ON子句中運(yùn)用等號(hào)銜接,不支持非等值銜接。假設(shè)銜接語(yǔ)句中有WHERE子句,會(huì)先執(zhí)行JOIN子句,再執(zhí)行WHERE子句??梢詊oin多個(gè)表。例如:表employee數(shù)據(jù)如下:employee_idname0張三1李四2王五4趙六表job數(shù)據(jù)如下:job_idjobemployee_id0工程師01職員12保潔23保安3Hive開(kāi)發(fā)運(yùn)用-數(shù)據(jù)表銜接命令創(chuàng)建employee表創(chuàng)建表createtableemployee(employee_idstring,namestring)rowformatdelimitedfieldsterminatedby','storedastextfile;加載數(shù)據(jù):本地?cái)?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ù):本地?cái)?shù)據(jù)位置:/tmp/job.txtloaddatalocalinpath'file/tmp/job.txt'intotablejob;Hive開(kāi)發(fā)運(yùn)用-數(shù)據(jù)表銜接命令內(nèi)銜接內(nèi)銜接指的是把符合兩邊銜接條件的數(shù)據(jù)查詢(xún)出來(lái)。查詢(xún)語(yǔ)句select*fromemployeejoinjobonemployee.employee_id=job.employee_id;結(jié)果如下:Hive開(kāi)發(fā)運(yùn)用-數(shù)據(jù)表銜接命令左外銜接假設(shè)左邊有數(shù)據(jù),右邊沒(méi)有數(shù)據(jù),那么左邊有數(shù)據(jù)的記錄的對(duì)應(yīng)列前往為空。查詢(xún)語(yǔ)句select*fromemployeeleftouterjoinjobonemployee.employee_id=job.employee_id;留意:不能運(yùn)用leftjoin,只能運(yùn)用leftouterjoin。結(jié)果如下:Hive開(kāi)發(fā)運(yùn)用-數(shù)據(jù)表銜接命令右外銜接假設(shè)左邊沒(méi)有數(shù)據(jù),右邊有數(shù)據(jù),那么右邊有數(shù)據(jù)的記錄對(duì)應(yīng)列前往為空。查詢(xún)語(yǔ)句select*fromemployeerightouterjoinjobonemployee.employee_id=job.employee_id;留意:不能運(yùn)用rightjoin,只能運(yùn)用rightouterjoin。結(jié)果如下:Hive開(kāi)發(fā)運(yùn)用-數(shù)據(jù)表銜接命令全外銜接顯示內(nèi)銜接,左外銜接,右外銜接的合集。查詢(xún)語(yǔ)句select*fromemployeefullouterjoinjobonemployee.employee_id=job.employee_id;結(jié)果如下:Hive開(kāi)發(fā)運(yùn)用-數(shù)據(jù)表銜接命令左半銜接左半銜接與in操作或者exists操作,效果一樣。查詢(xún)語(yǔ)句select*fromemployeeleftsemijoinjobonemployee.employee_id=job.employee_id;結(jié)果如下:上面語(yǔ)句相當(dāng)于如下語(yǔ)句:select*fromemployeewhereemployee_idin(selectemployee_idfromjob);Hive開(kāi)發(fā)運(yùn)用-數(shù)據(jù)表銜接命令hive0.9.0版本開(kāi)場(chǎng)支持in、notin、like、notlikein左邊的表在右邊表的范圍內(nèi)。與leftsemijoin效果一樣。select*fromemployeewhereemployee_idin(selectemployee_idfromjob);結(jié)果如下:左邊的表不在右邊表的范圍內(nèi)。select*fromemployeewhereemployee_idnotin(selectemployee_idfromjob);結(jié)果如下:notinnotlikeHive開(kāi)發(fā)運(yùn)用-數(shù)據(jù)表銜接命令like查詢(xún)左右模糊匹配的一切結(jié)果。select*fromemployeewherenamelike'張%';結(jié)果如下:查詢(xún)左右模糊匹配以外的一切結(jié)果。select*fromemployeewherenamenotlike'張%';結(jié)果如下:Hive開(kāi)發(fā)運(yùn)用-常用顯示命令查詢(xún)數(shù)據(jù)庫(kù):showdatabases;模糊搜索表:showtableslike'*name*';刪除數(shù)據(jù)庫(kù):dropdatabasedbname;刪除數(shù)據(jù)表:droptabletablename;查看表構(gòu)造信息:desctable_name;查看詳細(xì)表構(gòu)造信息:descformattedtable_name;查看分區(qū)信息:showpartitionstable_name;查看hdfs文件列表信息:hadoopfs-ls/user/hive/warehouse/查看hdfs文件內(nèi)容:hadoopfs-cat/user/hive/warehouse/file.txtHive開(kāi)發(fā)運(yùn)用-java客戶(hù)端hive需求援用的客戶(hù)端jar包列表: java端銜接hive,需求預(yù)先引入hive相關(guān)的客戶(hù)端jar包,jar包可以直接從hive安裝包的lib目錄下拷貝。jar包列表如下:Hive客戶(hù)端java代碼,如下:

Hive開(kāi)發(fā)運(yùn)用-java客戶(hù)端一、Hive簡(jiǎn)介二、Hive體系構(gòu)造三、Hive任務(wù)機(jī)制四、Hive運(yùn)用場(chǎng)景五、Hive安裝部署六、Hive開(kāi)發(fā)運(yùn)用七、SparkSQL簡(jiǎn)介什么是SparkSQLSparkSQL做為Spark生態(tài)里的成員。它是一個(gè)基于Spark引擎,運(yùn)轉(zhuǎn)在Hadoop上的SQL工具。它兼容Hive、RDD、parquet〔列式

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論