一、Hive運行模式
1.Hive的運行模式即任務的執行環境
2.分爲本地與集羣兩種,我們可以通過mapred.job.tracker 來指明
設置方式:hive > SET mapred.job.tracker=local
二、Hive的啓動方式
1.hive 命令行模式,直接輸入#/hive/bin/hive的執行程序,或者輸入 #hive --service cli
2. hive web界面的 (端口號9999), 啓動方式 #hive --service hwi 或者用於通過瀏覽器來訪問hive,http://hadoop0:9999/hwi/
三、Hive與傳統數據庫
四、Hive的數據類型
1.基本數據類型
tinyint/smallint/int/bigint
float/double
boolean
string
2.複雜數據類型
Array/Map/Struct
【注:沒有date/datetime】
五、Hive的數據存儲
1. Hive的數據存儲基於Hadoop HDFS
2.Hive沒有專門的數據存儲格式
3.存儲結構主要包括:數據庫、文件、表、視圖
4.Hive默認可以直接加載文本文件(TextFile),還支持sequence file 、RC file【基於 Hive 的文件格式:RCFile 簡介及其應用】
5.創建表時,指定Hive數據的列分隔符與行分隔符,Hive即可解析數據
六、Hive的數據模型
6.1 Hive的數據模型-數據庫
1.類似傳統數據庫的DataBase
2.默認數據庫"default" hive> use default;
3.創建一個新庫 hive > create database test_dw;
6.2 Hive的數據模型-內部表
1. 與數據庫中的 Table 在概念上是類似
2.每一個 Table 在 Hive 中都有一個相應的目錄存儲數據。例如,一個表 test,它在 HDFS 中的路徑爲:/user/hive/warehouse/test。
warehouse是在 hive-site.xml 中由 ${hive.metastore.warehouse.dir} 指定的數據倉庫的目錄。所有的 Table 數據(不包括 External Table)都保存在這個目錄中。
3.刪除表時,元數據與數據都會被刪除
4.在本地創建數據文件inner_table.dat
5.創建表 hive>create table inner_table (key string);
6.加載數據 hive>load data local inpath '/root/inner_table.dat' into table inner_table;
7.查看數據 select * from inner_table
select count(*) from inner_table
8.刪除表 drop table inner_table
6.3 Hive的數據模型-分區表
1.Partition 對應於數據庫的 Partition 列的密集索引
2.在 Hive 中,表中的一個 Partition 對應於表下的一個目錄,所有的 Partition 的數據都存儲在對應的目錄中
例如:test表中包含 date 和 city 兩個 Partition,則對應於date=20130201, city = bj 的 HDFS 子目錄爲:/warehouse/test/date=20130201/city=bj
對應於date=20130202, city=sh 的HDFS 子目錄爲;/warehouse/test/date=20130202/city=sh
3.創建分區表
CREATE TABLE tmp_table #表名
(
title string, # 字段名稱 字段類型
minimum_bid double,
quantity bigint,
have_invoice bigint
)COMMENT '註釋:XXX' #表註釋
PARTITIONED BY(pt STRING) #分區表字段(如果你文件非常之大的話,採用分區表可以快過濾出按分區字段劃分的數據)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001' # 字段是用什麼分割開的
STORED AS SEQUENCEFILE; #用哪種方式存儲數據,SEQUENCEFILE是hadoop自帶的文件壓縮格式
4.一些相關命令
SHOW TABLES; # 查看所有的表
SHOW TABLES '*TMP*'; #支持模糊查詢
SHOW PARTITIONS TMP_TABLE; #查看錶有哪些分區
DESCRIBE TMP_TABLE; #查看錶結構
5.練習
創建數據文件 a.c
創建表
create table people(userid int,username string) partitioned by(nation string) row format delimited fields terminated by '\t' stored as TEXTFILE LOCATION '/people'; stored as TEXTFILE;
加載數據到分區 load data local inpath '/a.c' into table people partition (nation='China');
查看數據 select * from people;
select count(*) from people;
在Hive命令行下在HDFS上創建文件夾並上傳文件
dfs -mkdir
dfs -put /b.j /people/nation=Japan;
爲表添加元數據信息 alter table add partition (nation='Japan') location"/people/nation=Japan";
查看數據
select * from people;
刪除分區
alter table people drop partition (nation='Japan');
刪除表 drop table partition_table
6.4 Hive的數據模型-外部表
1.指向已經在 HDFS 中存在的數據,可以創建 Partition
2.它和 內部表 在元數據的組織上是相同的,而實際數據的存儲則有較大的差異
內部表 的創建過程和數據加載過程(這兩個過程可以在同一個語句中完成),在加載數據的過程中,實際數據會被移動到數據倉庫目錄中;之後對數據的訪問將會直接在數據倉庫目錄中完成。刪除表時,表中的數據和元數據將會被同時刪除。
外部表 只有一個過程,加載數據和創建表同時完成,並不會移動到數據倉庫目錄中,只是與外部數據建立一個鏈接。當刪除一個外部表時,僅刪除該鏈接。
3.創建外部表的格式
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 '44' LINES TERMINATED BY '12'
STORED AS TEXTFILE
LOCATION 'hdfs://centos:9000/user/data/staging/page_view';
4.練習
創建數據文件external_table.dat
創建表
hive>create external table external_table1 (key string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' location '/home/external';
在HDFS創建目錄/home/external 並把數據上傳到HDFS上
#hadoop fs -put /home/external_table.dat /home/external
加載數據
LOAD DATA INPATH '/home/external_table1.dat' INTO TABLE external_table1;
查看數據
select * from external_table
select count(*) from external_table
刪除表
drop table external_table
七、Hive的數據模型-表的操作
表的修改
alter table target_tab add columns (cols,string)
表的刪除
drop table
導入數據
(1)當數據被加載至表中時,不會對數據進行任何轉換。Load 操作只是將數據複製/移動至 Hive 表對應的位置。
(2)格式:
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
(3)把一個Hive表導入到另一個已建Hive表 方式一
INSERT OVERWRITE TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement FROM from_statement
方式二 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
(col_name data_type, ...) …
AS SELECT …
查詢
(1)格式
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list]
[ CLUSTER BY col_list | [DISTRIBUTE BY col_list] [SORT BY col_list] | [ORDER BY col_list] ]
[LIMIT number]
其中 DISTRIBUTE BY 指定分發器(Partitioner),多Reducer可用
(2)基於Partition的查詢
一般 SELECT 查詢是全表掃描。但如果是分區表,查詢就可以利用分區剪枝(input pruning)的特性,類似“分區索引“”,只掃描一個表中它關心的那一部分。Hive 當前 的實現是,只有分區斷言(Partitioned by)出現在離 FROM 子句最近的那個WHERE 子句中,纔會啓用分區剪枝。例如,如果 page_views 表(按天分區)使用 date 列分區,以下語句只會讀取分區爲‘2008-03-01’的數據。
SELECT page_views.* FROM page_views WHERE page_views.date >= '2013-03-01' AND page_views.date <= '2013-03-01'
(3)IMIT Clause Limit 可以限制查詢的記錄數。查詢的結果是隨機選擇的。下面的查詢語句從 t1 表中隨機查詢5條記錄:
SELECT * FROM t1 LIMIT 5
(4)Top N查詢 下面的查詢語句查詢銷售記錄最大的 5 個銷售代表。
SELECT * FROM sales SORT BY amount DESC LIMIT 5
表的連接 (1)內連接
select b.name,a.* from dim_ac a join acinfo b on (a.ac=b.acip) limit 10;
(2)左外連接 select b.name,a.* from dim_ac a left outer join acinfo b on a.ac=b.acip limit 10;
八、Hive的API
JAVA客戶端相關代碼:
Class.forName("org.apache.hadoop.hive.jdbc.HiveDriver");
Connection con = DriverManager.getConnection("jdbc:hive://192.168.1.102:10000/wlan_dw", " root", "123");
Statement stmt = con.createStatement();
String querySQL="SELECT * FROM wlan_dw.dim_m order by flux desc limit 10";
ResultSet res = stmt.executeQuery(querySQL);
while (res.next()) {
System.out.println(res.getString(1) +"\t" +res.getLong(2)+"\t" +res.getLong(3)+"\t" +res.getLong(4)+"\t" +res.getLong(5));
}
、