Hive之前不常用,每次都是現用現查,就是現在總結記下筆記,邊學邊記(下面都是一些簡單的例子,由易到難嗎)>_<。
1、基本的查詢語句
現在假設有數據庫 db
,數據表table1
,table2
,
--1、查看錶的創建信息:
show create table db.table1;
--2、查看錶的分區信息:
show partitions db.table1;
--3、查看錶的記錄數:
select count(*) from db.table1 where dt = '2019-03-21';
--4、簡單連接操作:
select t1.userid, t1.name, t2.score from
(select userid, name from db.table1 where dt = '2019-03-21' ) t1
left join
(select userid, score from db.table2 where dt='2019-03-21') t2
on t1.userid=t2.userid;
--5、給字段起別名:
select userid as user_id from db.table1 where dt = '2019-03-19' ;
--6、求兩個表的差集,出在表A中,但不能出現表B中,即 A-B:
select a.user_id from
(select user_id from db.table1) a
left outer join
(select user_id from db.table2) b
on a.user_id = b.user_id
where b.user_id is null ;
2、hive的排序相關查詢
1. 基本的排序操作
語句 | 功能 | 優點 | 缺點 | 備註 |
---|---|---|---|---|
order by | 與其他SQL一樣,全局有序 | 保證全局有序 | 大數據下,會比較耗時 | ------ |
sort by | 在reduce階段進行排序 | 在reduce階段進行排序,比較快 | 不能保證全局有序,除非只有一個reduce | 使用sort by 之後,在進行全局排序會比較快 |
distribute by和sort by 聯合使用 | 先聚合在排序,或者先分組在排序 | ------ |
------ |
------ |
cluster by | 先聚合在排序,或者先分組在排序(同上) | ------ |
------ |
------ |
注意: 關鍵字 asc
和 desc
表示升序和降序,其中 cluster by
指定的列只能降序
使用示例:
-- 1、 對單個字段,降序排序(如果是多個字段,就繼續在後面追加即可)
-- 按照年齡降序排序, sort by 使用方法與order by 一樣。
select user_id, age from db.table order by age desc;
--2、 先按照班級class分組,在按照得分score、年齡age 升序排列
select class, age, score from db.table distribute by class sort by age asc, score asc;
--3、 先按照班級class分組,在按照年齡age 排列
select class, age from db.table cluster by class sort by age;
2. 分組排序實現
一般有兩種實現方式:
(1)row_number() over( partition by 分組字段 order by 排序字段) as rank(rank 可隨起名,表示排序後標識)
(2)row_number() over( distribute by 分組字段 sort by 排序字段) as rank(rank 可隨起名,表示排序後標識)
-- 注意:
--1、 partition by 只與 order by 組合使用
--2、 distribute by 只與 sort by 組合使用
--3、 rank,可以隨便起的名字,表示排序後的序號,例如,1,2,3,4,5...
--4、 分組字段、排序字段,均可爲多個字段。
--5、 分組字段設置爲常量,例如爲1,這時,僅可以獲取按照排列字段,排序後的--序號。
使用示例:
--1、選取每個班級成績前三名的同學:
select class, student, score from (
select class, student, score, row_number() over (distribute by class sort by score desc) as rank from db.table1
)as t1
where t1.rank < 4;
--2、distribute by,後面可以跟常數,例如1,這樣只是獲取按照某一列排序後的標識:
select class, student, score, row_number() over (distribute by 1 sort by score desc) as rank from db.table1;
3. 從全量表數據獲取增量數據
select a.id from
(select distinct id from db.table1 where dt='2020-05-27') a
left outer join
(select distinct id from db.table1 where dt='2020-05-26') b
on a.id=b.id
where b.id is null
4. 從全量表數據獲取增量數據
partition="show partitions db.table1;"
latest_info=$(hive -e "$partition" | sort | tail -n 1)
latest_dt=${latest_info:3:13}
echo $latest_dt
5. 去重後統計行數
select count(*) from (select distinct id from ab.table where dt='2020-05-26') a
聲明: 總結學習,有問題或不當之處,可以批評指正哦,謝謝。