Hive
成都創(chuàng)新互聯(lián)公司是一家專注于網(wǎng)站制作、成都網(wǎng)站制作與策劃設(shè)計,定西網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:定西等地區(qū)。定西做網(wǎng)站價格咨詢:028-86922220
hive是基于Hadoop的一個數(shù)據(jù)倉庫工具,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表,并提供完整的sql查詢功能,Hive 定義了簡單的類 SQL 查詢語言,稱為 HQL,它允許熟悉 SQL 的用戶查詢數(shù)據(jù)可以將 sql語句轉(zhuǎn)換為MapReduce任務(wù)進行運行,不必開發(fā)專門的MapReduce。畢竟會寫SQL的人比寫JAVA的人多,這樣可以讓一大批運營人員直接獲取海量數(shù)據(jù)。在數(shù)據(jù)倉庫建設(shè)中,HIVE靈活易用且易于維護,十分適合數(shù)據(jù)倉庫的統(tǒng)計分析。
本章內(nèi)容:
1) Hive簡介
2) Hive基礎(chǔ)組成
3) Hive執(zhí)行流程
4) Hive基礎(chǔ)操作
hive是建設(shè)在Hadoop之上,Hive包括如下組件:CLI(command line interface)、JDBC/ODBC、Thrift Server、WEB GUI、MetaStore和Driver(Complier、Optimizer和Executor)。
1) Driver組件:包括Complier、Optimizer和Executor,它的作用是將我們寫的HiveQL(類SQL)語句進行解析、編譯優(yōu)化,生成執(zhí)行計劃,然后調(diào)用底層的MapReduce計算框架。
2) Metastore組件:元數(shù)據(jù)服務(wù)組件存儲hive的元數(shù)據(jù),hive的元數(shù)據(jù)存儲在關(guān)系數(shù)據(jù)庫里,hive支持的關(guān)系數(shù)據(jù)庫有derby、MySQL。Hive還支持把metastore服務(wù)安裝到遠程的服務(wù)器集群里,從而解耦hive服務(wù)和metastore服務(wù)。
3) Thrift服務(wù):thrift是facebook開發(fā)的一個軟件框架,它用來進行可擴展且跨語言的服務(wù)的開發(fā),hive集成了該服務(wù),能讓不同的編程語言調(diào)用hive的接口。
4) CLI:command line interface,命令行接口。
5) Thrift客戶端: hive架構(gòu)的許多客戶端接口是建立在thrift客戶端之上,包括JDBC和ODBC接口。
6) WEBGUI:hive客戶端提供了一種通過網(wǎng)頁的方式訪問hive所提供的服務(wù)。
用戶接口主要有三個:CLI,Client和 WUI。其中最常用的是CLI,公司內(nèi)可通過堡壘機連接ssh hdp_lbg_ectech@10.126.101.7,直接輸入hive,就可連接到HiveServer。
Hive的metastore組件是hive元數(shù)據(jù)集中存放地。Metastore組件包括兩個部分:metastore服務(wù)和后臺數(shù)據(jù)的存儲。后臺數(shù)據(jù)存儲的介質(zhì)就是關(guān)系數(shù)據(jù)庫,例如hive默認的嵌入式磁盤數(shù)據(jù)庫derby,還有mysql數(shù)據(jù)庫。Metastore服務(wù)是建立在后臺數(shù)據(jù)存儲介質(zhì)之上,并且可以和hive服務(wù)進行交互的服務(wù)組件,默認情況下,metastore服務(wù)和hive服務(wù)是安裝在一起的,運行在同一個進程當中。我也可以把metastore服務(wù)從hive服務(wù)里剝離出來,metastore獨立安裝在一個集群里,hive遠程調(diào)用metastore服務(wù),這樣我們可以把元數(shù)據(jù)這一層放到防火墻之后,客戶端訪問hive服務(wù),就可以連接到元數(shù)據(jù)這一層,從而提供了更好的管理性和安全保障。使用遠程的metastore服務(wù),可以讓metastore服務(wù)和hive服務(wù)運行在不同的進程里,這樣也保證了hive的穩(wěn)定性,提升了hive服務(wù)的效率。
對于數(shù)據(jù)存儲,Hive沒有專門的數(shù)據(jù)存儲格式,可以非常自由的組織Hive中的表,只需要在創(chuàng)建表的時候告訴Hive數(shù)據(jù)中的列分隔符和行分隔符,Hive就可以解析數(shù)據(jù)。Hive中所有的數(shù)據(jù)都存儲在HDFS中,存儲結(jié)構(gòu)主要包括數(shù)據(jù)庫、文件、表和視圖。Hive中包含以下數(shù)據(jù)模型:Table內(nèi)部表,External Table外部表,Partition分區(qū),Bucket桶。Hive默認可以直接加載文本文件,還支持sequence file 、RCFile。
Hive的數(shù)據(jù)模型介紹如下:
1) Hive數(shù)據(jù)庫
類似傳統(tǒng)數(shù)據(jù)庫的DataBase,例如 hive >create database test_database;
2) 內(nèi)部表
Hive的內(nèi)部表與數(shù)據(jù)庫中的表在概念上是類似。每一個Table在Hive中都有一個相應(yīng)的目錄存儲數(shù)據(jù)。例如一個表hive_test,它在HDFS中的路徑為/home/hdp_lbg_ectech/warehouse/hdp_lbg_ectech_bdw.db/hive_test,其中/home/hdp_lbg_ectech/warehouse是在hive-site.xml中由${hive.metastore.warehouse.dir}指定的數(shù)據(jù)倉庫的目錄,所有的Table數(shù)據(jù)(不包括外部表)都保存在這個目錄中。刪除表時,元數(shù)據(jù)與數(shù)據(jù)都會被刪除。
建表語句示例:
CREATE EXTERNAL TABLE hdp_lbg_ectech_bdw.hive_test
(`userid` string COMMENT'')
ROW FORMAT DELIMITED FIELDS TERMINATED BY'\001';
load data inpath ‘/home/hdp_lbg_ectech/resultdata/test.txt’overwrite into table hive_test;
3) 外部表
外部表指向已經(jīng)在HDFS中存在的數(shù)據(jù),可以創(chuàng)建分區(qū)。它和內(nèi)部表在元數(shù)據(jù)的組織上是相同的,而實際數(shù)據(jù)的存儲則有較大的差異。內(nèi)部表在加載數(shù)據(jù)的過程中,實際數(shù)據(jù)會被移動到數(shù)據(jù)倉庫目錄中。刪除表時,表中的數(shù)據(jù)和元數(shù)據(jù)將會被同時刪除。而外部表只有一個過程,加載數(shù)據(jù)和創(chuàng)建表同時完成(CREATE EXTERNAL TABLE ……LOCATION),實際數(shù)據(jù)是存儲在LOCATION后面指定的 HDFS 路徑中,并不會移動到數(shù)據(jù)倉庫目錄中。當刪除一個外部表時,僅刪除該表的元數(shù)據(jù),而實際外部目錄的數(shù)據(jù)不會被刪除,推薦使用這種模式。
4) 分區(qū)
Partition相當于數(shù)據(jù)庫中的列的索引,但是Hive組織方式和數(shù)據(jù)庫中的很不相同。在Hive中,表中的一個分區(qū)對應(yīng)于表下的一個目錄,所有的分區(qū)數(shù)據(jù)都存儲在對應(yīng)的目錄中。
一般是按時間、地區(qū)、類目來分區(qū),便于局部查詢,避免掃描整個數(shù)據(jù)源。
5) 桶
Buckets是將表的列通過Hash算法進一步分解成不同的文件存儲。它對指定列計算hash,根據(jù)hash值切分數(shù)據(jù),目的是為了并行,每一個Bucket對應(yīng)一個文件。例如將userid列分散至32個bucket,首先對userid列的值計算hash,對應(yīng)hash值為0的HDFS目錄為/home/hdp_lbg_ectech/resultdata/part-00000;hash值為20的HDFS目錄為/home/hdp_lbg_ectech/resultdata/part-00020。
6) Hive的視圖
視圖與傳統(tǒng)數(shù)據(jù)庫的視圖類似。目前只有邏輯視圖,沒有物化視圖;視圖只能查詢,不能Load/Insert/Update/Delete數(shù)據(jù);視圖在創(chuàng)建時候,只是保存了一份元數(shù)據(jù),當查詢視圖的時候,才開始執(zhí)行視圖對應(yīng)的那些子查詢;
1) DDL操作:包括
l 建表,刪除表
l 修改表結(jié)構(gòu)
l 創(chuàng)建/刪除視圖
l 創(chuàng)建數(shù)據(jù)庫和顯示命令
l 增加分區(qū),刪除分區(qū)
l 重命名表
l 修改列的名字、類型、位置、注釋
l 增加/更新列
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] |
l CREATE TABLE 創(chuàng)建一個指定名字的表。如果相同名字的表已經(jīng)存在,則拋出異常;用戶可以用 IF NOT EXIST 選項來忽略這個異常
l EXTERNAL 關(guān)鍵字可以讓用戶創(chuàng)建一個外部表,在建表的同時指定一個指向?qū)嶋H數(shù)據(jù)的路徑(LOCATION)
l LIKE 允許用戶復(fù)制現(xiàn)有的表結(jié)構(gòu),但是不復(fù)制數(shù)據(jù)
l COMMENT可以為表與字段增加描述
l 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, ...)]
用戶在建表的時候可以自定義 SerDe 或者使用自帶的 SerDe。如果沒有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,將會使用自帶的 SerDe。在建表的時候,用戶還需要為表指定列,用戶在指定表的列的同時也會指定自定義的 SerDe,Hive 通過 SerDe 確定表的具體的列的數(shù)據(jù)。
l STORED AS
SEQUENCEFILE
| TEXTFILE
| RCFILE
| INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname
如果文件數(shù)據(jù)是純文本,可以使用 STORED AS TEXTFILE。如果數(shù)據(jù)需要壓縮,使用 STORED AS SEQUENCE 。
例子1:創(chuàng)建簡單表
CREATE TABLE pokes (foo INT, bar STRING); |
例子2:創(chuàng)建外部表
CREATE EXTERNAL TABLE page_view(viewTime INT, userid BIGINT, page_url STRING, referrer_url STRING, ip STRING COMMENT 'IP Address of the User', country STRING COMMENT 'country of origination') COMMENT 'This is the staging page view table' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\054' STORED AS TEXTFILE LOCATION ' |
例子3:創(chuàng)建分區(qū)表
CREATE TABLE par_table(viewTime INT, userid BIGINT, page_url STRING, referrer_url STRING, ip STRING COMMENT 'IP Address of the User') COMMENT 'This is the page view table' PARTITIONED BY(date STRING, pos STRING) ROW FORMAT DELIMITED ‘\t’ FIELDS TERMINATED BY '\n' STORED AS SEQUENCEFILE; |
例子4:創(chuàng)建Bucket表
CREATE TABLE par_table(viewTime INT, userid BIGINT, page_url STRING, referrer_url STRING, ip STRING COMMENT 'IP Address of the User') COMMENT 'This is the page view table' PARTITIONED BY(date STRING, pos STRING) CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS ROW FORMAT DELIMITED ‘\t’ FIELDS TERMINATED BY '\n' STORED AS SEQUENCEFILE; |
例子5:創(chuàng)建表并創(chuàng)建索引字段ds
CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING); |
例子6:復(fù)制一個空表
CREATE TABLE empty_key_value_store LIKE key_value_store; |
例子7:顯示所有表
SHOW TABLES; |
例子8:按正則條件(正則表達式)顯示表
SHOW TABLES '.*s'; |
例子9:表添加一列
ALTER TABLE pokes ADD COLUMNS (new_col INT); |
例子10:添加一列并增加列字段注釋
ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT 'a comment'); |
例子11:更改表名
ALTER TABLE events RENAME TO 3koobecaf; |
例子12:刪除列
DROP TABLE pokes; |
例子13:增加、刪除分區(qū)
增加: ALTER TABLE table_name ADD [IF NOT EXISTS] partition_spec [ LOCATION 'location1' ] partition_spec [ LOCATION 'location2' ] ... partition_spec: : PARTITION (partition_col = partition_col_value, partition_col = partiton_col_value, ...) 刪除: ALTER TABLE table_name DROP partition_spec, partition_spec,... |
例子14:重命名表
ALTER TABLE table_name RENAME TO new_table_name |
例子15:修改列的名字、類型、位置、注釋
ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name] 這個命令可以允許改變列名、數(shù)據(jù)類型、注釋、列位置或者它們的任意組合 |
例子16:創(chuàng)建/刪除視圖
CREATE VIEW [IF NOT EXISTS] view_name [ (column_name [COMMENT column_comment], ...) ][COMMENT view_comment][TBLPROPERTIES (property_name = property_value, ...)] AS SELECT 增加視圖 如果沒有提供表名,視圖列的名字將由定義的SELECT表達式自動生成 如果修改基本表的屬性,視圖中不會體現(xiàn),無效查詢將會失敗 視圖是只讀的,不能用LOAD/INSERT/ALTER
DROP VIEW view_name 刪除視圖 |
例子17:創(chuàng)建數(shù)據(jù)庫
CREATE DATABASE name |
例子18:顯示命令
show tables; show databases; show partitions ; show functions describe extended table_name dot col_name |
2) DML操作:元數(shù)據(jù)存儲
hive不支持用insert語句一條一條的進行插入操作,也不支持update操作。數(shù)據(jù)是以load的方式加載到建立好的表中。數(shù)據(jù)一旦導(dǎo)入就不可以修改。
DML包括:
l INSERT插入
l UPDATE更新
l DELETE刪除
l 向數(shù)據(jù)表內(nèi)加載文件
l 將查詢結(jié)果插入到Hive表中
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
Load 操作只是單純的復(fù)制/移動操作,將數(shù)據(jù)文件移動到 Hive 表對應(yīng)的位置。 filepath 相對路徑,例如:project/data1 絕對路徑,例如: /user/hive/project/data1 包含模式的完整 URI,例如:hdfs://namenode:9000/user/hive/project/data1 |
例子1:向數(shù)據(jù)表內(nèi)加載文件
LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE pokes; |
例子2:加載本地數(shù)據(jù),同時給定分區(qū)信息
LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15'); |
例子3:加載本地數(shù)據(jù),同時給定分區(qū)信息
LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15'); |
例子4:將查詢結(jié)果插入Hive表
基本模式: INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement
多插入模式: FROM from_statement INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 [INSERT OVERWRITE TABLE tablename2 [PARTITION ...] select_statement2] ...
自動分區(qū)模式: INSERT OVERWRITE TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) select_statement FROM from_statement |
例子3:將查詢結(jié)果寫入HDFS文件系統(tǒng)
INSERT OVERWRITE [LOCAL] DIRECTORY directory1 SELECT ... FROM ...
FROM from_statement INSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement1 [INSERT OVERWRITE [LOCAL] DIRECTORY directory2 select_statement2]
數(shù)據(jù)寫入文件系統(tǒng)時進行文本序列化,且每列用^A 來區(qū)分,\n換行 |
例子3:INSERT INTO
INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement |
3) DQL操作:數(shù)據(jù)查詢SQL
DQL包括:
l 基本的Select 操作
l 基于Partition的查詢
l Join
基本Select操作:
SELECT [ALL | DISTINCT] select_expr, select_expr, ... FROM table_reference [WHERE where_condition] [GROUP BY col_list [HAVING condition]] [ CLUSTER BY col_list | [DISTRIBUTE BY col_list] [SORT BY| ORDER BY col_list] ] [LIMIT number]
l 使用ALL和DISTINCT選項區(qū)分對重復(fù)記錄的處理。默認是ALL,表示查詢所有記錄。DISTINCT表示去掉重復(fù)的記錄 l Where 條件 l 類似我們傳統(tǒng)SQL的where 條件 l 目前支持 AND,OR ,0.9版本支持between l IN, NOT IN l 不支持EXIST ,NOT EXIST
ORDER BY與SORT BY的不同 l ORDER BY 全局排序,只有一個Reduce任務(wù) l SORT BY 只在本機做排序
Limit l Limit 可以限制查詢的記錄數(shù) |
例子1:按先件查詢
SELECT a.foo FROM invites a WHERE a.ds=' |
例子2:將查詢數(shù)據(jù)輸出至目錄
INSERT OVERWRITE DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM invites a WHERE a.ds=' |
例子3:將查詢結(jié)果輸出至本地目錄
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/local_out' SELECT a.* FROM pokes a; |
例子4:選擇所有列到本地目錄
hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a; INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a WHERE a.key < 100; INSERT OVERWRITE LOCAL DIRECTORY '/tmp/reg_3' SELECT a.* FROM events a; INSERT OVERWRITE DIRECTORY '/tmp/reg_4' select a.invites, a.pokes FROM profiles a; INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT COUNT(1) FROM invites a WHERE a.ds=' INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT a.foo, a.bar FROM invites a; INSERT OVERWRITE LOCAL DIRECTORY '/tmp/sum' SELECT SUM(a.pc) FROM pc1 a; |
例子5:將一個表的統(tǒng)計結(jié)果插入另一個表中
INSERT OVERWRITE TABLE events SELECT a.bar, count(1) FROM invites a WHERE a.foo > 0 GROUP BY a.bar; FROM pokes t1 JOIN invites t2 ON (t1.bar = t2.bar) INSERT OVERWRITE TABLE events SELECT t1.bar, t1.foo, t2.foo; |
例子6:將多表數(shù)據(jù)插入到同一表中
FROM src INSERT OVERWRITE TABLE dest1 SELECT src.* WHERE src.key < 100 INSERT OVERWRITE TABLE dest2 SELECT src.key, src.value WHERE src.key >= 100 and src.key < 200 INSERT OVERWRITE TABLE dest3 PARTITION(ds='2008-04-08', hr='12') SELECT src.key WHERE src.key >= 200 and src.key < 300 INSERT OVERWRITE LOCAL DIRECTORY '/tmp/dest4.out' SELECT src.value WHERE src.key >= 300; |
例子7:將文件流直接插入文件
FROM invites a INSERT OVERWRITE TABLE events SELECT TRANSFORM(a.foo, a.bar) AS (oof, rab) USING '/bin/cat' WHERE a.ds > '2008-08-09'; |
在Hadoop生態(tài)圈中,針對大數(shù)據(jù)進行批量計算時,通常需要一個或者多個MapReduce作業(yè)來完成,但這種批量計算方式是滿足不了對實時性要求高的場景。
此時就到了Storm上場的時候,那Storm又是如何高效完成實時計算的呢?下一篇我會介紹開源分布式實時計算系統(tǒng)——Storm。
如何用4個月學(xué)會Hadoop開發(fā)并找到年薪25萬工作?
免費分享一套17年最新Hadoop大數(shù)據(jù)教程和100道Hadoop大數(shù)據(jù)必會面試題。
因為鏈接經(jīng)常被和諧,需要的朋友請加微信 ganshiyun666 來獲取最新下載鏈接,注明“51CTO”
教程已幫助300+人成功轉(zhuǎn)型Hadoop開發(fā),90%起薪超過20K,工資比之前翻了一倍。
百度Hadoop核心架構(gòu)師親自錄制
內(nèi)容包括0基礎(chǔ)入門、Hadoop生態(tài)系統(tǒng)、真實商業(yè)項目實戰(zhàn)3大部分。其中商業(yè)案例可以讓你接觸真實的生產(chǎn)環(huán)境,訓(xùn)練自己的開發(fā)能力。