Hive Shell 命令詳解
Hive服務介紹
Hive默認提供的cli(shell)服務,如果需要啟動其他服務,那麽需要service參數來啟動其他服務,比如thrift服務、metastore服務等。可以通過命令hive --service help查看hive支持的命令。
Hive Shell命令介紹
Hive的shell命令是通過${HIVE_HOME}/bin/hive文件進行控制的,通過該文件我們可以進行hive當前會話的環境管理、也進行進行hive的表管理等操作。hive命令需要使用‘;‘進行結束標示。通過hive -H查看幫助信息:另外從hive0.11版本開始支持--database <databasename>.
Hive Shell常用基本命令
Hive的Shell基本常用命令主要包含退出客戶端、添加文件、修改/查看環境變量、執行linux命令、執行dfs命令等。命令包括:quit、exit、set、add JAR[S] <filepath> <filepath>*、list JAR[S]、delete JAR[S] <filepath>*、! <linux-command>、dfs <dfs command>等。除了Hive的基本命令外,其他的命令主要是DDL和DML等操作數據表的命令。
HiveQL介紹
HiveQL簡稱HQL,是一種類似sql的查詢語言,絕大多數語法和sql類似。HQL支持基本類型和復雜類型兩大類數據類型。基本類型包括TINYINT(1byte), SMALLINT(2byte), INT(4byte), BIGINT(8byte), FLOAT(4byte), DOUBLE(8byte), BOOLEAN(-), STRING(2G)。復雜類型包括ARRAY(一組有序數組,類型必須一致), MAP(無序鍵值對,鍵值內部字段類型必須相同,而且要求key的類型為基本數據類型), STRUCT(一組字段,類型任意)。
show、describe、explain命令介紹
show命令的主要作用是查看database、table、function等組件的名稱信息,也就是通過show命令我們可以知道我們的hive中有那些database;當前database中有那些table。等等。和mysql的show命令類型。
describe命令的主要作用是獲取database、table、partition的具體描述信息,包括存儲位置、字段類型等信息。
explain命令的主要作用是獲取hql語句的執行計劃,我們可以通過分析這些執行計劃來優化hql語句。
Database介紹
hive提供database的定義,database的主要作用是提供數據分割的作用,方便數據管理。命令如下:
創建: create (DATABASE|SCHEMA) [IF NOT EXISTS] database_name [COMMENT database_comment] [LOCATION hdfs_path] [WITH DBPROPERTIES (property_name=value,name=value....)]。
顯示描述信息:describe DATABASE|SCHEMA [extended] database_name。
刪除:DROP DATABASE|SCHEMA [IF EXISTS] database_name [RESTRICT|CASCADE]
使用: use database_name。
Hive表介紹
Hive中的表可以分為內部表(托管表)和外部表,區別在於:外部表的數據不是有hive進行管理的,也就是說當刪除外部表的時候,外部表的數據不會從hdfs中刪除。而內部表是又hive進行管理的,在刪除表的時候,數據也會刪除。一般情況下,我們在創建外部表的時候會將表數據的存儲路徑定義在hive的數據倉庫路徑之外。
Hive創建表主要有三種方式,第一種直接使用create table命令,第二種使用create table .... AS select ....(會產生數據)。第三種使用create table tablename like exist_tablename.命令。
create table命令介紹
案例1:
先將data2.txt文件上傳到hdfs的/customers文件夾中。
hdfs dfs -mkdir /customers
hdfs dfs -put data2.txt /customers
案例2:
先將data3.txt文件上傳到hdfs的/complex_table_test文件夾中。
hdfs dfs -mkdir /complex_table_test
hdfs dfs -put data2.txt /complex_table_test
案例3:
hive和hbase關聯
create external table hive_users
(key string,
id int,
name string,
phone string)
row format serde ‘org.apache.hadoop.hive.hbase.HBaseSerDe‘
stored by ‘org.apache.hadoop.hive.hbase.HBaseStorageHandler‘
with serdeproperties(‘hbase.columns.mapping‘=‘:key,f:id,f:name,f:phone‘)
tblproperties(‘hbase.table.name‘=‘users‘);
Hive shell 命令深入使用
前置條件:
hive啟動
root用戶登錄 密碼123456
啟動mysql:service mysqld restart
使用hadoop用戶登錄,啟動metastore:hive --service metastore &
數據文件準備
將文檔文件夾中的classes.txt和students.txt移動到linux機器和hdfs文件系統上。
命令:hdfs dfs -put ./13 /beifeng/
創建hive相關表準備:
create database beifeng13;
create table students(studentId int comment ‘this is student id, is not null‘, classId int comment ‘this is class id, can set to null‘, studentName string comment ‘this is student name‘) row format delimited fields terminated by ‘,‘;
create table classes(classId int comment ‘this is class id, is not null‘, className string comment ‘this is class name‘) row format delimited fields terminated by ‘,‘;
一、導入數據
1. 分別導入local和hdfs的數據
a. 分別從linux機器上導入數據
load data local inpath ‘/home/hadoop/datas/13/classes.txt‘ into table classes;
load data local inpath ‘/home/hadoop/datas/13/students.txt‘ into table students;
load data local inpath ‘/home/hadoop/datas/13/classes.txt‘ overwrite into table classes;
b. 從hdfs上導入數據
load data inpath ‘/beifeng/13/students.txt‘ into table students;
dfs -put /home/hadoop/datas/13/students.txt /beifeng/13/
load data inpath ‘/beifeng/13/students.txt‘ overwrite into table students;
2. 導入其他表的數據(多表插入)
將學生表的學生id和classid分別導出到不同表中,
create table test1(id int);
create table test2(id int);
from students insert into table test1 select studentid insert overwrite table test2 select distinct classid where classid is not null;
二、select語法介紹
from語法
1. 正常from:
select * from students;
2. from語句提前:
from students select *;
cte語法:
1. 獲取班級號為1的學生信息:
with tmp as (select studentid as sid,classid as cid,studentname as name from students where classid=1) from tmp select *;
2. 獲取總學生數、已經分配班級的學生數、未分配班級的學生數(作業1)。
分析;
總學生數:studentid的總數
分配班級的學生數:classid不為空的學生總數
未分配的學生數: classid為空的學生數
結果: 12 7 5
where & group by語法實例:
group語句只能返回對於的group列&進行聚合的value。
1. 獲取學生數大於3的班級id
from students select classid where classid is not null group by classid having count(studentid) > 3;
排序語法:
1. 使用order by根據學生id倒序。
select * from students order by studentid desc;
2. 設置hive.mapred.mode為strict,然後在進行order by操作。
set hive.mapred.mode=strict;
select * from students order by studentid desc; 會出現異常
select * from students order by studentid desc limit 5;
3. 使用sort by根據學生id排序。
select * from students sort by studentid desc;
4. 設置mapreduce.job.reduces個數為兩個,然後再使用sort by進行排序。
set mapreduce.job.reduces=2;
select * from students sort by studentid desc;
三、join語法
內連接語法
1. 獲取學生和班級之間完全匹配的數據。
select students.*,classes.* from classes join students on classes.classid=students.classid;
select students.*,classes.* from classes cross join students on classes.classid=students.classid;
外鏈接語法:
1. 獲取全部學生的班級信息,如果該學生沒有分配班級,那麽班級信息顯示為null。
select students.*, classes.* from students left join classes on students.classid = classes.classid;
2. 獲取全部班級的學生信息,如果某個班級沒有學生,那麽學生信息顯示為null。(作業2)
3. 獲取全部信息,如果沒有匹配數據的顯示null。(作業3)
半連接:
1. 獲取學生表中班級id在班級表中的所有學生信息。
sql: select students.* from students where classid in (select distinct classid from classes);
原hql: select students.* from students join classes on students.classid = classes.classid;
新hql: select students.* from students left semi join classes on students.classid=classes.classid;
mapjoin:
select /*+ mapjoin(classes) */ * from students join classes on students.classid=classes.classid;
四、子查詢
1. 獲取學生數最多的班級,學生的個數。
第一步:獲取每個班級的學生總數
第二步:選擇學生數最多的班級學生數
from (select count(studentid) as sc from students where classid is not null group by classid) as tmp select max(sc);
2. 獲取學生數最多的班級信息。(作業4)
第一步:獲取每個班級的學生總數
第二步:選擇學生數最多的班級學生數
第三步:根據最多的學生數和第一步獲取的表數據進行比較,獲取班級信息。
五、導出數據
1. 導出表關聯後的班級名稱和學生名稱(loca&hdfs)。(導出全部不為空的信息)
班級1,學生1
from (select classes.classname as col1, students.studentname as col2 from classes join students on classes.classid = students.classid) as tmp insert overwrite local directory ‘/home/hadoop/result/13/01‘ select col1,col2 insert overwrite directory ‘/beifeng/result/13/01/‘ select col1,col2 ;
格式化:
from (select classes.classname as col1, students.studentname as col2 from classes join students on classes.classid = students.classid) as tmp insert overwrite local directory ‘/home/hadoop/result/13/01‘ row format delimited fields terminated by ‘,‘ select col1,col2 ;
2. 同時分別將已經分配班級的學生和未分配班級的學生導出到不同的文件夾中。(作業5)
六、其他命令
1. 在students和classes表上創建一個視圖,視圖包含兩列分別是:班級名稱,學生名稱
create view viewname as select classes.classname as cname, students.studentname as sname from classes join students on classes.classid = students.classid
2. 在linux系統中通過命令hive -f/-e將所有學生信息保存到一個文件中。
新建一個文件,文件內容為:select * from students
執行:hive --database beifeng13 -f test.sql >> result.txt
Hive Shell 命令詳解