
下面是本課程概覽:
(1)hive系列之簡介,安裝,beeline和hiveserver2
(2)hive系列之基本操作
(3)hive系列之udf
(4)hive系列之二級分區和動態分區
(5)hive系列之分桶表
(6)hive系列之常用函數
(7)hive系列之系統講解開窗函數
(8)hive系列之存儲格式及常用壓縮格式
(9)hive系列之數據倉庫建模理論
(10)hive系列之數據倉庫建模-維度表和事實表
(11)hive系列之數據倉庫建模-退化維度和緩慢變化維
(12)hive系列之常用企業性能優化1
(13)hive系列之常用企業性能優化2
(14)hive系列之常用企業性能優化3
今天是第二講,Hive 的基本操作
今天的內容比較多,也比較枯燥,盡可能對著操作一遍,加深認識
01
數據庫相關
1.創建數據庫
create database db_hive;
create database if not exists db_hive;
2.創建數據庫到指定目錄下
create database if not exists db_hive_03 location '/user/wangkai/hive/warehouse/db_hive03.db';
3.顯示當前所有的數據庫
show databases;
4.查看數據庫描述
desc database db_hive;
5.刪除數據庫就不說了,很危險
02
數據類型
1、基本類型

這里著重說一下 TIMESTAMP
TIMESTAMP 類型的主要作用是在數據比較的效率上比較高
TIMESTAMP 類型 ,其對應的格式為:yyyy-MM-dd HH:MM:SS,從文件中導入時,必須滿足這個格式的才能導入,否則顯示為null
比如現在建一個表
create table dw.t_date (
t1 date,
t2 timestamp
)
comment '日期測試表'
row format delimited
fields terminated by ',';
創建文件提交到 hdfs 上
文件內容:
2019-09-01,2019-09-01 11:12:00
2019-08-01,2019-09-01 12:00
加載到表中
LOAD DATA INPATH '/tmp/datetest/date.txt' into TABLE dw.t_date;

最終t2不滿足格式,所以顯示了null
Hive 中比較常用的時間相關的udf :
unix_timestamp() 返回當前的時間戳
unix_timestamp('2019-09-01 11:10:10') 返回指定日期的時間戳
from_unixtime(1567307471) 返回 yyyy-MM-dd HH:MM:SS 格式的字符串
2、復雜類型
ARRAY、Map、struct、union,這些復雜類型是由基礎類型構成的
(1) Array
表示數組,是具有相同類型的變量的集合,這些變量稱為數組的元素,每個元素都有下標,從0開始
如下,我們建一張 person 表,名字、工作地點、愛好
create table dw.person(
name string,
work_locations array<string>,
other_info map<string,string>,
other_info2 struct<one:string,two:int>
)
row format delimited
fields terminated by ','
collection items terminated by '|'
map keys terminated by ':';
字段的分隔符是 ,
集合(數組和map)元素的分隔符是 |
map或者struct 的 鍵值對分隔符是 :
測試數據如下:

導入到表中

查詢第一個工作地點:
select name,work_locations[0] from dw.person;

(2) Map
是一組鍵值對元組集合,使用數組表示法,map['first'] 可以獲取值
比如上面的表中,查詢性別
select name,other_info['sex'] from dw.person;

(3)Struct
是不同類型元素的集合,可以用 點 描述符來取元素
select name,other_info2.one from dw.person;

03
內部表、外部表、分區表
1、內部表和外部表的區別
(1)未被 external 修飾的是內部表,被 external 關鍵字修飾的是外部表
(2)內部表由 Hive 自身管理,外部表由 HDFS 管理(也就是數據在別的目錄下,但元數據還是由 Hive 管理的)
(3)內部表數據的存儲位置是:hive.metastore.warehouse.dir(默認是:/user/hive/warehouse),外部表數據的存儲位置由自己制定
(4)刪除內部表會直接刪除元數據和存儲在表下面的數據,而刪除外部表只會刪除元數據,HDFS 上的數據并不會被刪除
2、分區表
為了對表進行合理的管理,以及提高查詢的效率,Hive 可以將表組織成分區,一個分區實際上就是一個目錄,一個表可以在多個維度上創建分區,分區之間的關系,就是目錄樹的關系。
就是在系統上創建文件夾,把分類數據放在不同的文件夾下,加快查詢速度。
比如創建日期和公司兩個分區,那么就可以指定查詢某個月某個公司的數據,而不同全表掃描
3、實戰
(1)內部表
上面建的dw.person 就是內部表,hive 會在 hdfs 文件上創建一個目錄,刪除表的時候,目錄下的數據也會被刪除
(2)外部表
使用關鍵字 external
create external table dw.t_test2 (
c1 string,
c2 string
)
如果沒有指定位置,hive 會生成一個目錄,如果指定了位置,那么不會創建目錄
create external table dw.t_test3 (
c1 string,
c2 string
)
location '/tmp/person';
刪除表,并不會刪除 hdfs 文件的
(3)分區表
create table dw.t_test4 (
c1 string,
c2 string
)
partitioned by (appId string)
新增分區
alter table dw.t_test4 add partition(appId='app');
會在hdfs上新增一個目錄
(4)外部分區表
顧名思義,即是外部表,又是分區表
create external table dw.t_test5 (
c1 string,
c2 string
)
partitioned by (appId string);
給外部分區表添加記錄
alter table dw.t_test4 add partition(appId='app') location '/tmp/test1';
04
其他建表方式
1.用查詢出來的數據建表
create table IF NOT EXISTS dw.log_20170629_2
AS select ip,user from dw.log_20170629;
2.僅僅創建已有表的表結構
create table IF NOT EXISTS dw.log_20170630
like dw.log_20170629;
05
加載和導出數據
1.加載數據
(1)這個命令是從本地拷貝文件到集群上,如果文件存在,則會重命名新增一份文件
load data local inpath '/opt/datas/student.txt' into table dw.student;
(2)加載數據并覆蓋原有數據,會刪除原有文件,再拷貝
load data local inpath '/opt/datas/student.txt' overwrite into table dw.student;
(3)加載數據到分區表
load data local inpath '/home/hadoop/data/emp.txt' into table dw.emp_partition partition (month='201509');
(4)加載hdfs數據,從hdfs移動數據到集群上
load data inpath '/opt/datas/student.txt' into table dw.student;
2.導出數據
(1)導出文件到本地目錄
insert overwrite local directory '/home/hadoop/data/hive_exp_emp2'
ROW FORMAT DELIMITED FIELDS TERMINATED BY 't'
select * from default.emp;
(2)hive命令
bin/hive -e "select * from default.emp;" > /opt/datas/exp_res.txt
(3)導出到hdfs中
insert overwrite directory '/user/wangkai/hive/hive_exp_emp'
ROW FORMAT DELIMITED FIELDS TERMINATED BY 't' COLLECTION ITEMS TERMINATED BY 'n'
下一篇是 hive 的 udf ,持續關注 kk大數據 噢