hive學(xué)習(xí)筆記

1.1 什么是Hive

?Hive是基于Hadoop的一個(gè)數(shù)據(jù)倉(cāng)庫(kù)工具,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射成為一張數(shù)據(jù)庫(kù)表,并提供類SQL的查詢功能。可以將sql語(yǔ)句轉(zhuǎn)化為MapReduce任務(wù)進(jìn)行運(yùn)行。Hive提供了一系列的工具,可以用來(lái)進(jìn)行數(shù)據(jù)提取轉(zhuǎn)化加載(ETL),這是一種可以存儲(chǔ)、查詢和分析存儲(chǔ)在 Hadoop 中的大規(guī)模數(shù)據(jù)的機(jī)制。

Hive是基于Hadoop的一個(gè)數(shù)據(jù)倉(cāng)庫(kù)工具,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫(kù)表,并提供類SQL查詢功能。

1.2 為什么使用Hive

1.)?直接使用hadoop所面臨的問(wèn)題

人員學(xué)習(xí)成本太高

項(xiàng)目周期要求太短

MapReduce實(shí)現(xiàn)復(fù)雜查詢邏輯開(kāi)發(fā)難度太大

2.)

操作接口采用類SQL語(yǔ)法,提供快速開(kāi)發(fā)的能力。

避免了去寫MapReduce,減少開(kāi)發(fā)人員的學(xué)習(xí)成本。

擴(kuò)展功能很方便。

1.3 Hive的特點(diǎn)

1.)可擴(kuò)展

Hive可以自由的擴(kuò)展集群的規(guī)模,一般情況下不需要重啟服務(wù)。

2.)延展性

Hive支持用戶自定義函數(shù),用戶可以根據(jù)自己的需求來(lái)實(shí)現(xiàn)自己的函數(shù)。

3.)容錯(cuò)

良好的容錯(cuò)性,節(jié)點(diǎn)出現(xiàn)問(wèn)題SQL仍可完成執(zhí)行。

1.4?Hive與傳統(tǒng)數(shù)據(jù)庫(kù)對(duì)比

2 框架圖:

? ? ?用戶接口: Shell/CLI,CLI(Command Line Interface),Shell 終端命令行,采用交互形式使用 Hive 命令行與 Hive 進(jìn)行交互。Cli 啟動(dòng)的時(shí)候,會(huì)同時(shí)啟動(dòng)一個(gè) Hive 副本。JDBC/ODBC客戶端是Hive的JAVA實(shí)現(xiàn),與傳統(tǒng)數(shù)據(jù)庫(kù)JDBC類似。Web UI通過(guò)瀏覽器訪問(wèn)hive。主要用來(lái)將我們的sql語(yǔ)句提交給hive。

?????Thrift服務(wù)器:Thrift 是 Facebook 開(kāi)發(fā)的一個(gè)軟件框架,可以用來(lái)進(jìn)行可擴(kuò)展且跨語(yǔ)言的服務(wù)的開(kāi)發(fā), Hive 集成了該服務(wù),能讓不同的編程語(yǔ)言調(diào)用 Hive 的接口。

?????元數(shù)據(jù)庫(kù): 存儲(chǔ)在 Hive 中的數(shù)據(jù)的描述信息。Hive 將元數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中,如 mysql、(默認(rèn))derby。Hive 中的元數(shù)據(jù)包括表的名字,表的列和分區(qū)及其屬性,表的屬性(是否為外部表 等),表的數(shù)據(jù)所在目錄等。

?????解釋器包含編譯器、優(yōu)化器、執(zhí)行器:完成HQL 查詢語(yǔ)句從詞法分析、語(yǔ)法分析、編譯、優(yōu)化以及查詢計(jì)劃的生成。。編譯器:主要將sql語(yǔ)句編譯成一個(gè)MR的任務(wù)。優(yōu)化器:主要是對(duì)我們的sql語(yǔ)句進(jìn)行優(yōu)化。執(zhí)行器:提交mr任務(wù),進(jìn)行執(zhí)行。

?????Hive 的數(shù)據(jù)存儲(chǔ)在 HDFS 中,查詢計(jì)劃被轉(zhuǎn)化為 MapReduce 任務(wù),在 Hadoop 中執(zhí)行.

3.Hive的數(shù)據(jù)存儲(chǔ)

?????Hive的所有數(shù)據(jù)都存儲(chǔ)在Hdfs中,沒(méi)有專門的數(shù)據(jù)存儲(chǔ)格式,也沒(méi)有為數(shù)據(jù)建立索引,用戶可以非常自由的組織 Hive 中的表,用戶定義數(shù)據(jù)格式需要指定三個(gè)屬性:列分隔符(通常為空格、”\t”、”\x001″)、行分隔符(”\n”)以及讀取文件數(shù)據(jù)的方法(Hive 中默認(rèn)有三個(gè)文件格式 TextFile,SequenceFile 以及 RCFile)。

Hive 中包含以下數(shù)據(jù)模型:DB、Table,External Table,Partition,Bucket:

1、db:在hdfs中表現(xiàn)為{hive.metastore.warehouse.dir}目錄下一個(gè)文件夾.${hive.metastore.warehouse.dir}是在配置文件中定義的數(shù)據(jù)倉(cāng)庫(kù)位置

2、table:在hdfs中表現(xiàn)所屬db目錄下一個(gè)文件夾

3、external table:與table類似,不過(guò)其數(shù)據(jù)存放位置可以在任意指定路徑

4、partition:在hdfs中表現(xiàn)為table目錄下的子目錄

5、bucket:在hdfs中表現(xiàn)為同一個(gè)表目錄下根據(jù)hash散列之后的多個(gè)文件

4.Hive的基本操作

4.1 操作數(shù)據(jù)庫(kù):

?????????? 創(chuàng)建數(shù)據(jù)庫(kù): create database if not exists 數(shù)據(jù)庫(kù)名;

???創(chuàng)建數(shù)據(jù)庫(kù)并指定hdfs存儲(chǔ)位置: create database 數(shù)據(jù)庫(kù)名 location ‘位置’;

???查看有哪些數(shù)據(jù)庫(kù): show databases;

???修改數(shù)據(jù)庫(kù)的信息(數(shù)據(jù)庫(kù)的元數(shù)據(jù)信息是不可更改的,包括數(shù)據(jù)庫(kù)的名稱以及數(shù)據(jù)庫(kù)所在的位置):alter database 數(shù)據(jù)庫(kù)名 set dbproperties()

???查看數(shù)據(jù)庫(kù)的信息:desc database 數(shù)據(jù)庫(kù)名;

???查詢?cè)敿?xì)數(shù)據(jù)庫(kù)信息:desc database extended 數(shù)據(jù)庫(kù)名;

???刪除數(shù)據(jù)庫(kù)(刪除一個(gè)空數(shù)據(jù)庫(kù),如果數(shù)據(jù)庫(kù)下面有數(shù)據(jù)表,那么就會(huì)報(bào)錯(cuò)):drop database 數(shù)據(jù)庫(kù)名;

???強(qiáng)制刪除數(shù)據(jù)庫(kù)(包含數(shù)據(jù)庫(kù)下面的表一起刪除):drop database myhive cascade;

4.2 操作數(shù)據(jù)庫(kù)表:

? 4.2.1創(chuàng)建數(shù)據(jù)庫(kù)表語(yǔ)法:

???????????? ? ? ?CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name

???????????? ? ? ?[(col_name data_type [COMMENT col_comment], …)]

???????????? ? ? ?[COMMENT table_comment]

???????????? ? ? ?[PARTITIONED BY (col_name data_type [COMMENT col_comment], …)]

???????????? ? ? ?[CLUSTERED BY (col_name, col_name, …)

???????????? ? ? ?[SORTED BY (col_name [ASC|DESC], …)] INTO num_buckets BUCKETS]

???????????? ? ? ?[ROW FORMAT row_format]

???????????? ? ? ?[STORED AS file_format]

???????????? ? ? ?[LOCATION hdfs_path]

說(shuō)明:

1、 CREATE TABLE 創(chuàng)建一個(gè)指定名字的表。如果相同名字的表已經(jīng)存在,則拋出異常;用戶可以用 IF NOT EXISTS 選項(xiàng)來(lái)忽略這個(gè)異常。

2、 EXTERNAL關(guān)鍵字可以讓用戶創(chuàng)建一個(gè)外部表,在建表的同時(shí)指定一個(gè)指向?qū)嶋H數(shù)據(jù)的路徑(LOCATION),Hive 創(chuàng)建內(nèi)部表時(shí),會(huì)將數(shù)據(jù)移動(dòng)到數(shù)據(jù)倉(cāng)庫(kù)指向的路徑;若創(chuàng)建外部表,僅記錄數(shù)據(jù)所在的路徑,不對(duì)數(shù)據(jù)的位置做任何改變。在刪除表的時(shí)候,內(nèi)部表的元數(shù)據(jù)和數(shù)據(jù)會(huì)被一起刪除,而外部表只刪除元數(shù)據(jù),不刪除數(shù)據(jù)。

3、 LIKE 允許用戶復(fù)制現(xiàn)有的表結(jié)構(gòu),但是不復(fù)制數(shù)據(jù)。

4、 ROW FORMAT DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char] [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char] | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, …)]

用戶在建表的時(shí)候可以自定義 字段的分隔符 或者使用自帶的 SerDe。如果沒(méi)有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,將會(huì)使用自帶的 SerDe。在建表的時(shí)候,用戶還需要為表指定列,用戶在指定表的列的同時(shí)也會(huì)指定自定義的 SerDe,Hive通過(guò) SerDe 確定表的具體的列的數(shù)據(jù)。

5、 STORED AS SEQUENCEFILE|TEXTFILE|RCFILE

如果文件數(shù)據(jù)是純文本,可以使用 STORED AS TEXTFILE。如果數(shù)據(jù)需要壓縮,使用 STORED AS SEQUENCEFILE。

6、PARTITIONED BY

分區(qū)指的是在創(chuàng)建表時(shí)指定的partition的分區(qū)空間。一個(gè)表可以擁有一個(gè)或者多個(gè)分區(qū),每個(gè)分區(qū)以文件夾的形式單獨(dú)存在表文件夾的目錄下。partition就是輔助查詢,縮小查詢范圍,加快數(shù)據(jù)的檢索速度和對(duì)數(shù)據(jù)按照一定的規(guī)格和條件進(jìn)行管理。

7、CLUSTERED BY

對(duì)于每一個(gè)表(table)或者分區(qū), Hive可以進(jìn)一步組織成桶,也就是說(shuō)桶是更為細(xì)粒度的數(shù)據(jù)范圍劃分。Hive也是 針對(duì)某一列進(jìn)行桶的組織。Hive采用對(duì)列值哈希,然后除以桶的個(gè)數(shù)求余的方式?jīng)Q定該條記錄存放在哪個(gè)桶當(dāng)中。

把表(或者分區(qū))組織成桶(Bucket)有兩個(gè)理由:

(1)獲得更高的查詢處理效率。桶為表加上了額外的結(jié)構(gòu),Hive 在處理有些查詢時(shí)能利用這個(gè)結(jié)構(gòu)。具體而言,連接兩個(gè)在(包含連接列的)相同列上劃分了桶的表,可以使用 Map 端連接 (Map-side join)高效的實(shí)現(xiàn)。比如JOIN操作。對(duì)于JOIN操作兩個(gè)表有一個(gè)相同的列,如果對(duì)這兩個(gè)表都進(jìn)行了桶操作。那么將保存相同列值的桶進(jìn)行JOIN操作就可以,可以大大較少JOIN的數(shù)據(jù)量。

(2)使取樣(sampling)更高效。在處理大規(guī)模數(shù)據(jù)集時(shí),在開(kāi)發(fā)和修改查詢的階段,如果能在數(shù)據(jù)集的一小部分?jǐn)?shù)據(jù)上試運(yùn)行查詢,會(huì)帶來(lái)很多方便。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 官方參考文檔 LanguageManual DDL 創(chuàng)建/刪除/更改/使用數(shù)據(jù)庫(kù) 在hive sql中databa...
    井地兒閱讀 1,254評(píng)論 0 1
  • hive簡(jiǎn)介 解釋一:Hive是一個(gè)數(shù)據(jù)倉(cāng)庫(kù)基礎(chǔ)工具在Hadoop中用來(lái)處理結(jié)構(gòu)化數(shù)據(jù)。它架構(gòu)在Hadoop之上,...
    卡卡xx閱讀 6,575評(píng)論 0 4
  • 一、HIVE簡(jiǎn)介 Hive是一種建立在Hadoop文件系統(tǒng)上的數(shù)據(jù)倉(cāng)庫(kù)架構(gòu),并對(duì)存儲(chǔ)在HDFS中的數(shù)據(jù)進(jìn)行分析和管...
    老實(shí)李閱讀 567評(píng)論 0 1
  • Hive的表在邏輯上由存儲(chǔ)的數(shù)據(jù)和描述表中數(shù)據(jù)形式的相關(guān)元數(shù)據(jù)組成。數(shù)據(jù)通常存儲(chǔ)在HDFS中,元數(shù)據(jù)通常保存在關(guān)系...
    井地兒閱讀 619評(píng)論 0 1
  • Hive是一個(gè)數(shù)據(jù)倉(cāng)庫(kù)基礎(chǔ)工具,在Hadoop中用來(lái)處理結(jié)構(gòu)化的數(shù)據(jù)。它架構(gòu)在Hadoop之上,hive底層數(shù)據(jù)存...
    井地兒閱讀 1,010評(píng)論 0 1

友情鏈接更多精彩內(nèi)容