一、HiveSQL基本操作
一、Hive資料型別
Hive所有資料型別分為兩種:
- 基本型別
- 複雜型別
1、基本型別
型別 | 描述 | 示例 |
---|---|---|
boolean | true/false | true |
tinyint | 1位元組的有符號整數 | -127~128 |
smallint | 2個位元組的有符號整數,-32768~32767 | 1S |
int | 4個位元組的帶符號整數 | 1 |
bigint | 8位元組帶符號整數 | 1L |
float | 4位元組單精度浮點數 | 1.0 |
double | 8位元組單精度浮點數 | 1.0 |
deicimal | 任意精度的帶符號小數 | 1.0 |
string | 字串,變長 | “a”,‘b’ |
varchar | 變長字串 | “a”,‘b’ |
char | 固定長度字串 | “a”,‘b’ |
binary | 位元組陣列 | |
timestamp | 時間戳,納秒精度 | |
date | 日期 | ‘2018-04-07’ |
2、複雜型別
型別 | 描述 | 示例 |
---|---|---|
array | 有序的的同類型的集合 | array(1,2) |
map | key-value:key必須為原始型別,value可以任意型別 | map(‘a’,1,’b’,2) |
struct | 欄位集合,型別可以不同 | struct(‘1’,1,1.0), named_stract(‘col1’,’1’,’col2’,1,’clo3’,1.0) |
二、儲存格式
Hive會為每個建立的資料庫在HDFS上建立一個目錄,該資料庫的表會以子目錄形式儲存,表中的資料會以表目錄下的檔案形式儲存。對於default資料庫,預設的預設資料庫沒有自己的目錄,default資料庫下的表預設存放在/user/hive/warehouse目錄下。
1、textfile
textfile為預設格式,儲存方式為行儲存。資料不做壓縮,磁碟開銷大,資料解析開銷大。
2、SequenceFile
SequenceFile是Hadoop API提供的一種二進位制檔案支援,其具有使用方便、可分割、可壓縮的特點。 SequenceFile支援三種壓縮選擇:NONE, RECORD, BLOCK。 Record壓縮率低,一般建議使用BLOCK壓縮。
3、RCFile
一種行列儲存相結合的儲存方式。
4、ORCFile
資料按照行分塊,每個塊按照列儲存,其中每個塊都儲存有一個索引。hive給出的新格式,屬於RCFILE的升級版,效能有大幅度提升,而且資料可以壓縮儲存,壓縮快 快速列存取。
5、Parquet
Parquet也是一種列式儲存,同時具有很好的壓縮效能;同時可以減少大量的表掃描和反序列化的時間。
三、操作資料庫
1、建立資料庫
-- 建立資料庫語法:
CREATE DATABASE IF NOT EXISTS database_name;
--例如:
CREATE DATABASE IF NOT EXISTS userdb;
2、刪除資料庫
-- 刪除資料庫語法:
DROP DATABASE StatementDROP (DATABASE|SCHEMA) [IF EXISTS] database_name;
-- 例如:
DROP DATABASE IF EXISTS userdb;
3、進入資料庫
-- 進入資料庫
USE database_name;
四、操作表屬性
1、顯示資料庫下面所有表
SHOW TABLES;
2、刪除表
DROP TABLE [IF EXISTS] table_name;
3、顯示建表結果
SHOW CREATE TABLE table_name;
4、顯示錶分割槽
SHOW PARTITION table_name;
5、修改表屬性
-- 內部錶轉外部表
ALTER TABLE table_name SET TBLPROPERTIES ('EXTERNAL'='TRUE');
-- 外部錶轉內部表
ALTER TABLE table_name SET TBLPROPERTIES ('EXTERNAL'='FALSE');
6、表重新命名
ALTER TABLE table_name RENAME TO new_table_name;
7、新增列
ALTER TABLE table_name ADD COLUMNS (cloumn_name string);
8、刪除列
ALTER TABLE name DROP [COLUMN] column_name;
9、修改列
ALTER TABLE name CHANGE column_name new_name new_type;
10、刪除分割槽
ALTER TABLE table_name DROP IF EXISTS PARTITION(day=); -- 這裡分割槽是day
11、增加分割槽
-- 分割槽欄位包含:p_hour,p_city,p_loctype
ALTER TABLE table_name IF NOT EXISTS \
ADD PARTITION (p_hour='2017113003', p_city='573', p_loctype='MHA');
12、修改分割槽、LOCATION
-- 修改location
ALTER TABLE table_name SET LOCATION "new_location_name";
-- partition修改location路徑
ALTER TABLE table_name PARTITION (dt='2008-08-08') SET LOCATION "new_location_name";
-- 修改分割槽名
ALTER TABLE table_name PARTITION (dt='2008-08-08') RENAME TO PARTITION (dt='20080808');
四、建立表
語法:
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.] table_name
[(col_name data_type [COMMENT col_comment], ...)]
[COMMENT table_comment]
[ROW FORMAT row_format]
[STORED AS file_format]
舉例:
CREATE TABLE IF NOT EXISTS employee ( eid int, name String,
salary String, destination String)
COMMENT ‘Employee details’
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘\t’
LINES TERMINATED BY ‘\n’
STORED AS TEXTFILE;
五、LOAD DATA語句
語法如下:
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename
[PARTITION (partcol1=val1, partcol2=val2 ...)]
-- 說明:
LOCAL是識別符號指定本地路徑。它是可選的。
OVERWRITE 是可選的,覆蓋表中的資料
PARTITION 這是可選的
引數描述:
- LOCAL是識別符號,指本地路徑,它是可選的
- 命令中帶LOCAL,表示從本地檔案系統中載入資料,可以是相對路徑,絕對路徑,目錄,URL(file:///user/hive/project/data)
- 命令中不帶LOCAL,表示從HDFS載入檔案,可以是完整的URL方式或者使用fa.default.name定義的值
- FILEPATH 檔案路徑,可以是:
- 相對路徑,如:project/data/file.txt
- 絕對路徑,如:/user/hive/project/data/file.txt
- 完整的URL,如:hdfs://namenode:9000/user/hive/project/data/file.txt
- 目錄,如:/user/project/data;表示載入目錄下的所有檔案
- OVERWRITE:
- 命令中帶OVERWRITE,載入資料之前會先清空目標表或分割槽中的內容
- 命令中不帶OVERWRITE,向目標表後者分割槽追加內容
例如:
- 本地資料載入到表
load data local inpath '/opt/test/emp.txt' \
into table emp_part partition (year='2016', month='3');
六、hive內建運算子
1、算術運算子
2、邏輯運算子
3、複雜運算子
七、hive檢視與索引
八、例項
1、把本地檔案放在新建表中
-- 建立表時載入
CREATE TABLE table_name (year string, temperature int) \
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LOAD DATA LOCAL INPATH 'xxx/input.txt' \
OVERWRITE INTO TABLE table_name;
2、把hdfs檔案放在新建表中
-- 建立表時載入
CREATE TABLE table_name (year string, temperature int) \
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' \
LOAD DATA INPATH '/emp.txt' INTO TABLE table_name partition (year='2016', month='6');
3、把查詢結果放在一個新建表中
描述: create table 表名 as sql
舉例:
create table meiying_rate as \
select a.pkg_name,b.installed-b.uninstall,a.rank from yinyl.meiying_applist a left outer join user.user_app_stat_daily b \
on a.pkg_name=b.packageid \
where b.day=20151101 and a.rank<=100000 \
order by a.rank;
4、把查詢結果放在本地檔案中
描述: insert overwrite local directory ‘路徑’ row format delimited fields terminated by ‘|’ sql
舉例:
-- 第一種方式
insert overwrite local directory '${dir_in}rate_${DATE}/' \
row format delimited fields terminated by '|' 、
select a.pkg_name,b.installed-b.uninstall,a.rank from yinyl.meiying_applist a left outer join user.user_app_stat_daily b on a.pkg_name=b.packageid where b.day=${DATE} and a.rank<=100000 order by a.rank;
-- 第二種方式
hive>
hive -e 'select * from testdb2.emp' >> ./emp_export.txt
5、把查詢結果放在HDFS檔案中
insert overwrite directory '${dir_in}rate_${DATE}/' \
row format delimited fields terminated by '|' 、
select a.pkg_name,b.installed-b.uninstall,a.rank from yinyl.meiying_applist a left outer join user.user_app_stat_daily b on a.pkg_name=b.packageid where b.day=${DATE} and a.rank<=100000 order by a.rank;
6、差集使用左右連線
select from 表a right(left) outer join 表b on 條件 where
create table diff_in_bj_idc_mangguo as SELECT BB.uid FROM (SELECT dw_user_lastlogin.uid FROM report_dw_mdp.dw_user_lastlogin where dw_user_lastlogin.day=20151028 and dw_user_lastlogin.app_id ='X0LuNCmE6t6VuvA1b3EyW4') AA RIGHT OUTER JOIN (SELECT user_bj_idc_20151028.uid FROM yuankai.user_bj_idc_20151028) BB ON (AA.uid= BB.uid) WHERE AA.uid IS NULL;
7、其他
去重:distinct 分組:group by 排序:order by (若有where放在其後)
8、shell 執行hive
hive>hive -e “insert overwrite local directory ‘${dir_in}rate_${DATE}/’ row format delimited fields terminated by ‘|’ select a.pkg_name,b.installed-b.uninstall,a.rank from yinyl.meiying_applist a left outer join user.user_app_stat_daily b on a.pkg_name=b.packageid where b.day=${DATE} and a.rank<=100000 order by a.rank”
九、注意
上述例項,建立表時,使用外部表,否則刪除表時,會將原始資料刪掉;