1. 建表語句
create table page_view(
viewTime INT,
userId BIGINT,
pageUrl STRING,
refererUrl STRING,
ip STRING COMMENT 'ip address of user'
) COMMENT 'This is the page view table'
PARTITIONED BY (dt STRING, country STRING)
CLUSTERED BY (userId) SORTED BY (viewTime) INTO 32 BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'
LINES TERMINATED BY '\n'
COLLECTION ITEMS TERMINATED BY '\002'
MAP KEYS TERMINATED BY '\003'
STORED AS SEQUENCEFILE
LOCATION '<hdfs_location>';
- PATITIONED BY: 用於指定分區字段,每指定一個字段就表示基於該字段建立一個文件夾,如示例在一級目錄中存在多個dt分區文件夾,在每一個dt文件夾下又存在基於country分區的文件夾;
- 這裏須要注意PARTITIONED BY後的字段不能在建表語句中出現,其中的字段會自動添加到表結構中;
- CLUSTERED BY:兼具合併和排序的功能,合併指的是用於指定map端將數據處理以後傳輸到reduce端的數據合併方式,而排序指的是每一個reduce中數據的排序方式方式,其只能爲降序排序;
- SORTED BY:指定在map端將數據傳輸到reduce端時每一個reduce中數據的排序方式,默認是按照升序排序的。須要注意的是SORTED BY只保證每一個reduce中的數據是按照指定字段排序的,而不保證reduce之間的數據是有序的;
- ROW FORMAT DELIMITED:用於指定加載數據時數據的分隔方式。LIENS TERMINATED BY指定每一行數據以什麼字符結尾;FIELDS TERMINATED BY指定了每一個字段之間使用'\001'進行分隔;COLLECTION ITEMS TERMINATED BY指定字段數據爲集合時其內部每一個元素之間的分隔方式爲'\002';MAP KEYS TERMINATED BY指定集合元素若是爲MAP時,其鍵值對的分隔方式爲'\003';
- STORED AS: 用於指定加載方式,有TEXTFILE和SEQUENCEFILE兩種值,TEXTFILE表示以純文本形式加載,SEQUENCEFILE則表示以壓縮文件形式加載;
- LOACTION:用於指定初始數據的加載地址,該地址爲HDFS文件系統中的文件。
2. 查看錶
describe page_view;
describe extended page_view;
3. 刪除表
drop table page_view;
- 刪除表page_view,該命令只會刪除表的元數據和數據,若是指定的是external表(外部表),那麼該命令是不會刪除文件系統中的數據的。
4. 修改表
① 增長分區
alter table page_view add
partition (dt='2010-08-08', country='us') location '/path/to/us/part080808'
partition (dt='2010-08-09', country='us') location '/path/to/us/part080809';
② 刪除分區
alter table page_view drop partition (dt='2018-08-08', country='us');
③ 重命名錶名
alter table page_view rename to page_view_new;
④ 修改字段
alter table page_view change ip ip_address string after refererurl;
- 修改字段格式爲alter table table_name change column_name new_column_name column_type (first|after column_name);
alter table page_view add columns (name string comment 'view name');
- 往page_view表中添加name字段,注意字段列表的括號不能省略。
5. 視圖
① 建立視圖
create view onion_referers (
url comment 'URL of Referring page'
) comment 'Referrers to the Onion website'
as
select distinct refererurl
from page_view
where pageurl='www.theonion.com';
- 視圖的查詢語句中能夠有order by和limit語句,該limit至關於一個全局的limit,若是對視圖的查詢中包含limit,那麼其會受限於視圖建立語句中的全局limit;
- 視圖是隻讀的,不能用於LOAD/INSERT/ALTER;
- 建立視圖時若是視圖已經存在則會報錯;
② 刪除視圖
drop view onion_referers;
6. 函數
① 建立函數
CREATE TEMPORARY FUNCTION function_name AS class_name;
② 刪除函數
DROP TEMPORARY FUNCTION function_name
7. 展現描述語句
① 展現表
show tables "page*|view";
- 最後的雙引號中是一個描述性語句,相似於正則表達式,但只支持三種符號:*, |, [s]。 *分別表示任意數量的任意字符,|表示二者取其一便可,[s]表示能夠包含該字符也能夠不包含該字符。
show partitions page_view;
show table extended like '*';
show functions like '*'
8. 加載數據
① load加載數據
hive> load data inpath '/user/eg2/list_male.txt' overwrite into table list partition (gender='male');
hive> load data inpath '/user/eg2/list_female.txt' overwrite into table list partition (gender='female');
- 在load data後若是沒有local關鍵字,那麼默認後面的路徑是hdfs中的路徑,若是有local關鍵字,則指定的是本地機器路徑;
- overwrite關鍵字用於指定是否覆蓋hive中同目錄的文件,由於若是hive中已經有該路徑的數據,那麼加載數據時是會報錯的,這是爲了防止數據丟失,若是有overwrite,則會覆蓋已有的數據;
- 在加載數據時須要注意,不一樣分區的數據須要分別加載,load命令其實只是簡單的將數據文件複製到相應的分區目錄下。
② insert加載數據
hive> insert into table list1 partition (gender='male') select name, birthday from list where gender='male';
hive> insert into table list1 partition (gender='female') select name, birthday from list where gender='female';
- 在insert的時候須要注意,若是目標表有分區,那麼須要指定當前插入的是哪一個分區的數據;
- 在進行插入的時候,分區字段是不須要在後續的select中的,其會自動存儲爲partition後的字段指定的值,然後續的select語句也只須要包含其他的字段便可,如這裏的select語句只包含了name和birthday字段。
③ insert導出數據
insert overwrite directory '/user/eg2/' select * from list;
- 這裏overwrite不能省略;
- overwrite後可接local關鍵字,若是有該關鍵字,那麼後面的路徑則表示本地路徑,不然表示HDFS文件系統上的路徑。
9. SQL查詢
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]]
[LIMIT number];
- 這裏須要注意的是CLUSTER BY col_list和DISTRIBUTE BY col_list SORT BY col_list兩個是可選的,CLUSTER BY col_list其實至關於DISTRIBUTE BY col_list SORT BY col_list DESC的一個組合;
- 在進行查詢時,若是表是已分區的,那麼在查詢字段中添加分區字段的話將會大大提高查詢效率,由於須要掃描的數據量減小了。