文章目錄
hive高級應用
數據導入
Load 加載數據
load data local inpath '/data/dept.txt' into table dept_partion;
對於以上的加載數據的語法,可以從本地加載數據,也可以從HDFS加載數據。
- Local : 代表從本地加載數據
- HDFS: 把local 去掉代表從HDFS上加載數據
- 把準備上傳的數據,上傳到HDFS 目錄中
dfs -put /data/dept.txt /data ;
- 執行
load data inpath '/data/dept.txt' into table dept_partion;
加載HDFS上的數據的時候 ,HDFS上的數據,會進行剪切,所以原目錄中的文件不存在
而在本地加載的時候,數據是進行復制的
對於以上的語法,存在如下的關鍵字:
Overwrite : 表示覆蓋已有的數據,不加上該關鍵字則表示對已有的數據進行追加
不使用overwrite關鍵字的時候會對已有數據進行追加,接下使用overwrite關鍵字觀察使用之後的結果
load data inpath '/data/dept.txt' overwrite into table dept_partion;
結果發現,把之前的數據全部覆蓋爲本次加載的數據
Insert 插入數據
通過insert 語句也可以向表中導入數據,該語法如下
insert into dept_partion values('200','beijing');
As select 通過查詢語句創建表 (常用)
根據查詢結果創建表 , 查詢到的結果,會在加載到新創建的表中
create table dept_name as select dname from dept_partion;
以上的表的創建方式,經常會在清洗數據的時候使用
Location 指定加載數據的位置
create EXTERNAL table student4(id int,name string)
row format delimited fields terminated by '\t'
stored as textfile
location '/user/hive/warehouse/student';
對於以上的語法,在創建表的時候,指定數據加載在HDFS上位置
數據導出
insert導出
將查詢的結果導出到本地
insert overwrite local directory '/data/dept2.txt' select * from dept_partion;
將查詢結果按照指定分隔符進行導出
insert overwrite local directory '/data/dept2.txt'
row format delimited fields terminated by '\t' select * from dept_partion;
將查詢結果導出到HDFS 上 去掉關鍵字local
insert overwrite directory '/data/dept2.txt'
row format delimited fields terminated by '\t' select * from dept_partion;
使用HDFS命令導出數據文件到本地
所謂hive中的數據,其實就是保存在HDFS上的數據,直接使用hdfs命令也可以從集羣中下載想要的數據到linux本地文件系統中
dfs -get /data/dept2.txt/000000_0 /data/dept3.txt
通過hive 交互命令方式完成
bin/hive -e 'select * from dept_partion' > /data/dept4.txt
通過hive 中shell 命令實現數據的導出
基本查詢
基礎查詢
- 首先準備,需要練習的數據,創建emp表
create table emp(
empno int,
ename string,
job string,
mgr int ,
edate string ,
sal double ,
deptno int)
row format delimited fields terminated by '\t';
- 加載emp 數據到創建好的emp中
load data local inpath '/data/emp.txt' into table emp;
對於查詢來說,存在全表查詢,以及按照指定字段進行查詢:
全表查詢爲
select * from emp;
按照指定字段查詢,員工名稱
select ename from emp;
爲列起別名 可以使用as 關鍵字
select ename as myname from emp;
常用的函數
- count 求總行數
select count(*) as n from emp;
- sum 總和
select sum(sal) as sal from emp;
- avg 平均數
select avg(sal) as sal from emp;
- max 求最大值
select max(sal) as sal from emp;
- min 求最小值
select min(sal) as sal from emp;
可以通過 show functions; 查看hive中所有的函數
limit
返回限制的行數
select * from emp limit 2;
where 語句
Where 語句hql 起到了一個過濾的作用,條件篩選
select sal from emp where ename='SMITH';
以上的語句爲一個條件的過濾,同時也可以增加多個條件的過濾
查詢員工信息,工資爲800 部門編號爲空的員工
select * from emp where sal=800.00 and deptno is null;
查詢工資的範圍800-1500之間的員工信息
select * from emp where sal between 800 and 1500 ;
查詢工資爲800 和 1500 員工信息
select * from emp where sal in(800,1500);
like 和 RLike (hive中擴展的功能)
like的使用
與like 配合使用的符號 % 表示任意字符
使用like 可以進行模糊查詢,範例查詢以S開頭的員工姓名
select * from emp where ename like 'S%';
RLike的使用
可以通過java中的正則表達式,來進行匹配
select * from emp where sal RLIKE '[2]';
分組
GROUP BY 語句
Group by 可以結果進行分組,之後在對分組之後的數據進行操作
範例: 查詢每個部門的平均工資
select deptno,avg(sal) from emp group by deptno;
Having 語句
- Having 與where的區別?
由於where之後不使用分組,所以說對於分組之後的條件篩選,可以使用having
根據以上的案例,繼續擴充,要求查詢出每個部門的平均工資,並且工資大於1000的部門
select deptno,avg(sal) as avg_sal from emp group by deptno having avg_sal >1000;
Join (左連接,右連接,內連接, 全連接)
- 左連接: 以關鍵字join左邊的表爲主,可以查詢出主表中的全部內容,右邊查詢出來和連接字段匹配的內容,不匹配的輸出爲null
- 右連接: 和上面類似
- 內連接: 只有join的字段完全匹配纔可以進行顯示
對於連接的操作,只能是兩張表以上可以進行連接操作,準備數據emp 和dept
範例: 內連接查詢 部門與員工表的信息 按照deptno進行join
select e.empno,e.ename,d.deptno,d.dname from emp e join dept d on e.deptno=d.deptno;
左連接範例:
select e.empno,e.ename,d.deptno,d.dname from emp e left join dept d on e.deptno=d.deptno;
右連接範例:
select e.empno,e.ename,d.deptno,d.dname from emp e right join dept d on e.deptno=d.deptno;
- 全連接: full join 所有符合條件的數值都會被顯示,不符合的用nulll來顯示
範例: 全連接範例
select e.empno,e.ename,d.deptno,d.dname from emp e full join dept d on e.deptno=d.deptno;
排序
order by 全局排序
對於全局排序來說可以使用order by 關鍵字 可以使用 desc 降序 asc 升序
範例: 查詢員工信息並且按照工資進行降序排列
select * from emp order by sal desc ;
Desc 是按照降序排序,默認爲asc 升序
分組之後排序
範例:
select deptno,avg(sal) as avg_sal from emp group by deptno order by avg_sal;
Mapreduce的內部排序(sort by )
對每個mapredue進行內部排序,不是全局排序
- 設置redue的個數
set mapreduce.job.reduces=3;
- 查看設置的reduce 個數
set mapreduce.job.reduces;
- 按照部門編號進行排序查詢
select * from emp sort by deptno;
- 導出到本地
insert overwrite local directory '/data/emp' select * from emp sort by deptno;
分區排序(distribute by )
distribute by : 類似mapreduce中的partition , 結合sort by使用
範例:按照部門編號,進行分區。然後在按照員工編號進行排序
在使用distribute by 必須先設置reduce的個數
insert overwrite local directory '/data/emp2' select * from emp distribute by deptno sort by empno desc;