hadoop13--hive導入導出, 基本查詢,分組, 排序

hive高級應用

數據導入

Load 加載數據

load data local inpath '/data/dept.txt' into table dept_partion;

對於以上的加載數據的語法,可以從本地加載數據,也可以從HDFS加載數據。

  • Local : 代表從本地加載數據
  • HDFS: 把local 去掉代表從HDFS上加載數據
  1. 把準備上傳的數據,上傳到HDFS 目錄中
	dfs -put /data/dept.txt /data ;
  1. 執行
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 命令實現數據的導出

基本查詢

基礎查詢

  1. 首先準備,需要練習的數據,創建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';
  1. 加載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;

常用的函數

  1. count 求總行數
select count(*) as n from emp;
  1. sum 總和
select sum(sal) as sal from emp;
  1. avg 平均數
select avg(sal) as sal from emp;
  1. max 求最大值
select max(sal) as sal from emp;
  1. 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進行內部排序,不是全局排序

  1. 設置redue的個數
set mapreduce.job.reduces=3;
  1. 查看設置的reduce 個數
set mapreduce.job.reduces;
  1. 按照部門編號進行排序查詢
select * from emp sort by deptno;
  1. 導出到本地
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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章