文章目錄
- 第一章 Hive基本概念
- 1.1 什么是Hive
- 1.1.1 Hive簡介
- 1.1.2 Hive本質
- 1.1.3 和資料庫的比較
- 第二章 Hive資料型別
- 2.1 基本資料型別
- 2.2 集合資料型別
- 2.2.3 型別轉化
- 轉換規則
- 使用CAST顯式資料型別轉換
- 第三章 DDL資料
- 3.1 對庫
- 3.1.1 創建資料庫
- 3.1.2 查詢資料庫
- 3.1.3 洗掉資料庫
- 3.2對表
- 3.2.1 創建表
- 3.2.2 管理表(內部表)
- 3.2.3 外部表
- 3.2.4 修改表
- 3.2.5 增加/修改/替換列資訊
- 第四章 DML
- 4.1 資料匯入
- 4.1.1 向表中裝載資料(Load)
- 4.1.2 通過查詢陳述句向表中插入資料(Insert)
- 4.1.3查詢陳述句中創建表并加載資料(As Select)
- 4.1.4 **創建表時通過Location指定加載資料路徑**
- 4.1.5 **Import資料到指定Hive表中**
- 4.2 資料匯出
- 4.2.1 Insert匯出
- 4.2.2 Hadoop命令匯出到本地
- Export匯出到HDFS上
- **Sqoop匯出**
- 4.3 清除表中資料 (Truncate)
- 預告
第一章 Hive基本概念
1.1 什么是Hive
1.1.1 Hive簡介
Hive:由Facebook開源用于解決海量結構化日志的資料統計工具,
Hive:基于Hadoop的一個資料倉庫工具,可以將結構化的資料檔案映射為一張表,并提供類SQL查詢功能,
我這種憨憨電腦就只能處理這么多資料了,再多要廢了~~~~

1.1.2 Hive本質
本質:將HQL轉化成MapReduce程式
(1)Hive處理的資料存盤在HDFS
(2)Hive分析資料底層的實作是MapReduce
(3)執行程式運行在Yarn上
1.1.3 和資料庫的比較
由于 Hive 采用了類似SQL 的查詢語言 HQL(Hive Query Language),因此很容易將 Hive 理解為資料庫,**其實從結構上來看,Hive 和資料庫除了擁有類似的查詢語言,再無類似之處,**資料庫可以用在 Online 的應用中,但是Hive 是為資料倉庫而設計的,清楚這一點,有助于從應用角度理解 Hive 的特性,下面從多個方面比較二者:
查詢語言
由于SQL被廣泛的應用在資料倉庫中,因此,專門針對Hive的特性設計了類SQL的查詢語言HQL,熟悉SQL開發的開發者可以很方便的使用Hive進行開發,
資料更新
由于Hive是針對資料倉庫應用設計的,而資料倉庫的內容是讀多寫少的,因此,Hive中不建議對資料的改寫,所有的資料都是在加載的時候確定好的,而資料庫中的資料通常是需要經常進行修改的,因此可以使用 INSERT INTO … VALUES 添加資料,使用 UPDATE … SET修改資料,
執行延遲
Hive 在查詢資料的時候,由于沒有索引,需要掃描整個表,因此延遲較高,另外一個導致 Hive 執行延遲高的因素是 MapReduce框架,由于MapReduce 本身具有較高的延遲,因此在利用MapReduce 執行Hive查詢時,也會有較高的延遲,相對的,資料庫的執行延遲較低,當然,這個低是有條件的,即資料規模較小,當資料規模大到超過資料庫的處理能力的時候,Hive的并行計算顯然能體現出優勢,
資料規模
由于Hive建立在集群上并可以利用MapReduce進行并行計算,因此可以支持很大規模的資料;對應的,資料庫可以支持的資料規模較小,
第二章 Hive資料型別
2.1 基本資料型別
| Hive資料型別 | Java資料型別 | 長度 | 例子 |
|---|---|---|---|
| TINYINT | byte | 1byte有符號整數 | 20 |
| SMALINT | short | 2byte有符號整數 | 20 |
| INT | int | 4byte有符號整數 | 20 |
| BIGINT | long | 8byte有符號整數 | 20 |
| BOOLEAN | boolean | 布爾型別,true或者false | TRUE FALSE |
| FLOAT | float | 單精度浮點數 | 3.14159 |
| DOUBLE | double | 雙精度浮點數 | 3.14159 |
| STRING | string | 字符系列,可以指定字符集,可以使用單引號或者雙引號, | ‘now is the time’ “for all good men” |
| TIMESTAMP | 時間型別 | ||
| BINARY | 位元組陣列 |
對于Hive的String型別相當于資料庫的varchar型別,該型別是一個可變的字串,不過它不能宣告其中最多能存盤多少個字符,理論上它可以存盤2GB的字符數,
2.2 集合資料型別
| 資料型別 | 描述 | 語法示例 |
|---|---|---|
| STRUCT | 和c語言中的struct類似,都可以通過“點”符號訪問元素內容,例如,如果某個列的資料型別是STRUCT{first STRING, last STRING},那么第1個元素可以通過欄位.first來參考, | struct()例如struct<street:string, city:string> |
| MAP | MAP是一組鍵-值對元組集合,使用陣串列示法可以訪問資料,例如,如果某個列的資料型別是MAP,其中鍵->值對是’first’->’John’和’last’->’Doe’,那么可以通過欄位名[‘last’]獲取最后一個元素 | map()例如map<string, int> |
| ARRAY | 陣列是一組具有相同型別和名稱的變數的集合,這些變數稱為陣列的元素,每個陣列元素都有一個編號,編號從零開始,例如,陣列值為[‘John’, ‘Doe’],那么第2個元素可以通過陣列名[1]進行參考, | Array()例如array |
Hive有三種復雜資料型別ARRAY、MAP 和 STRUCT,ARRAY和MAP與Java中的Array和Map類似,而STRUCT與C語言中的Struct類似,它封裝了一個命名欄位集合,復雜資料型別允許任意層次的嵌套,
2.2.3 型別轉化
Hive的原子資料型別是可以進行隱式轉換的,類似于Java的型別轉換,例如某運算式使用INT型別,TINYINT會自動轉換為INT型別,但是Hive不會進行反向轉化,例如,某運算式使用TINYINT型別,INT不會自動轉換為TINYINT型別,它會回傳錯誤,除非使用CAST操作,
大可隱式轉小,小不可隱式轉大
轉換規則
(1)任何整數型別都可以隱式地轉換為一個范圍更廣的型別,如TINYINT可以轉換成INT,INT可以轉換成BIGINT,
(2)所有整數型別、FLOAT和STRING型別都可以隱式地轉換成DOUBLE,(String型別轉換的前提是阿拉伯數字)
(3)TINYINT、SMALLINT、INT都可以轉換為FLOAT,
(4)BOOLEAN型別不可以轉換為任何其它的型別,
使用CAST顯式資料型別轉換
例如CAST('1' AS INT)將把字串'1' 轉換成整數1;如果強制型別轉換失敗,如執行CAST('X' AS INT),運算式回傳空值 NULL,
第三章 DDL資料
3.1 對庫
3.1.1 創建資料庫
語法:
CREATE DATABASE [IF NOT EXISTS] database_name
[COMMENT database_comment] #資料庫的說明
[LOCATION hdfs_path] #存盤在HDFS的路徑
[WITH DBPROPERTIES (property_name=property_value, ...)]; #資料庫相關配置項
3.1.2 查詢資料庫
1) 顯示資料庫
show databases;
- 過濾顯示查詢的資料庫
show databases like 'db_hive*';
- 查看資料庫詳情
desc database [extended] db_hive; #extended 顯示詳細資訊
4) 切換當前資料庫
use 庫名;
3.1.3 洗掉資料庫
- 洗掉空資料庫
drop [if not exists] database 庫名;
- 如果資料庫不為空,可以采用cascade(級聯)命令強制洗掉
drop database 庫名 cascade;
3.2對表
3.2.1 創建表
語法:
語法很長,根據需要使用就好了,我們簡單的創建表的話其實還是很簡單的,不信我們看一下下面的案例~~~
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]
[TBLPROPERTIES (property_name=property_value, ...)] //
[AS select_statement]
欄位解釋說明
(1)CREATE TABLE 創建一個指定名字的表,如果相同名字的表已經存在,則拋出例外;用戶可以用 IF NOT EXISTS 選項來忽略這個例外,
(2)EXTERNAL關鍵字可以讓用戶創建一個外部表,在建表的同時可以指定一個指向實際資料的路徑(LOCATION),在洗掉表的時候,內部表的元資料和資料會被一起洗掉,而外部表只洗掉元資料,不洗掉資料,
(3)COMMENT:為表和列添加注釋,
(4)PARTITIONED BY創建磁區表
(5)CLUSTERED BY創建分桶表
(6)SORTED BY不常用,對桶中的一個或多個列另外排序
(7)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(Serialize/Deserilize)或者使用自帶的SerDe,如果沒有指定ROW FORMAT 或者ROW FORMAT DELIMITED,將會使用自帶的SerDe,在建表的時候,用戶還需要為表指定列,用戶在指定表的列的同時也會指定自定義的SerDe,Hive通過SerDe確定表的具體的列的資料,
(8)STORED AS指定存盤檔案型別
常用的存盤檔案型別:SEQUENCEFILE(二進制序列檔案)、TEXTFILE(文本)、RCFILE(列式存盤格式檔案)
如果檔案資料是純文本,可以使用STORED AS TEXTFILE,如果資料需要壓縮,使用 STORED AS SEQUENCEFILE,
(9)LOCATION :指定表在HDFS上的存盤位置,
(10)AS:后跟查詢陳述句,根據查詢結果創建表,
(11)LIKE允許用戶復制現有的表結構,但是不復制資料,
案例
創建部門表
create external table if not exists dept(
deptno int,
dname string,
loc int
)
row format delimited fields terminated by '\t';
簡簡單單樸實無華,小白就該有小白的亞子!
3.2.2 管理表(內部表)
默認創建的表都是所謂的管理表,有時也被稱為內部表,因為這種表,Hive會(或多或少地)控制著資料的生命周期,Hive默認情況下會將這些表的資料存盤在由配置項hive.metastore.warehouse.dir(例如,/user/hive/warehouse)所定義的目錄的子目錄下, 當我們洗掉一個管理表時,Hive也會洗掉這個表中資料,管理表不適合和其他工具共享資料,
3.2.3 外部表
因為表是外部表,所以Hive并非認為其完全擁有這份資料,洗掉該表并不會洗掉掉這份資料,不過描述表的元資料資訊會被洗掉掉,
兩種表的應用場景
每天將收集到的網站日志定期流入HDFS文本檔案,在外部表(原始日志表)的基礎上做大量的統計分析,用到的中間表、結果表使用內部表存盤,資料通過SELECT+INSERT進入內部表,
管理表到外部表的轉換
alter table table_name set tblproperties('EXTERNAL'='TRUE');
顯然外部表到內部表那么引數就是false,
3.2.4 修改表
重命名表
ALTER TABLE table_name RENAME TO new_table_name;
3.2.5 增加/修改/替換列資訊
(1)更新列
ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name]
(2)增加和替換列
ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)
注:ADD是代表新增一欄位,欄位位置在所有列后面(partition列前),REPLACE則是表示替換表中所有欄位,
第四章 DML
4.1 資料匯入
4.1.1 向表中裝載資料(Load)
語法:
load data [local] inpath '資料的path' [overwrite] into table student [partition (partcol1=val1,…)];
說明:
(1)load data:表示加載資料
(2)local:表示從本地加載資料到hive表;否則從HDFS加載資料到hive表
(3)inpath:表示加載資料的路徑
(4)overwrite:表示覆寫表中已有資料,否則表示追加
(5)into table:表示加載到哪張表
(6)student:表示具體的表
(7)partition:表示上傳到指定磁區
4.1.2 通過查詢陳述句向表中插入資料(Insert)
基本模式插入
insert overwrite table student_par select id, name from student ;
4.1.3查詢陳述句中創建表并加載資料(As Select)
根據查詢結果創建表(查詢的結果會添加到新創建的表中)
create table if not exists student3
as select id, name from student;
4.1.4 創建表時通過Location指定加載資料路徑
4.1.5 Import資料到指定Hive表中
注意:先用export匯出后,再將資料匯入,
4.2 資料匯出
4.2.1 Insert匯出
1)將查詢的結果匯出到本地
hive (default)> insert overwrite local directory '/opt/module/hive/datas/export/student'
select * from student;
2)將查詢的結果格式化匯出到本地
hive(default)>insert overwrite local directory '/opt/module/hive/datas/export/student1'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
select * from student;
3)將查詢的結果匯出到HDFS上(沒有local)
hive (default)> insert overwrite directory '/user/atguigu/student2'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
select * from student;
4.2.2 Hadoop命令匯出到本地
hive (default)> dfs -get /user/hive/warehouse/student/student.txt
/opt/module/datas/export/student3.txt;
Export匯出到HDFS上
(defahiveult)> export table default.student to
'/user/hive/warehouse/export/student';
Sqoop匯出
后面學,暫時沒學
4.3 清除表中資料 (Truncate)
注意:Truncate只能洗掉管理表,不能洗掉外部表中資料
hive (default)> truncate table student;
default)> dfs -get /user/hive/warehouse/student/student.txt
/opt/module/datas/export/student3.txt;
預告
第5章 查詢
第6章 磁區表和分桶表
第7章 函式
第8章 企業級調優
第9章 Hive實戰
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/379160.html
標籤:其他
上一篇:RabbitMQ插件配置成功后打不開xxxx:15672,解決方法
下一篇:云計算基礎2-什么是云存盤?
