日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

asc desc排序_HIVE的学习之路(六)Hive的分组Join排序

發(fā)布時間:2025/3/20 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 asc desc排序_HIVE的学习之路(六)Hive的分组Join排序 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

分組

Group By語句

GROUP BY語句通常會和聚合函數(shù)一起使用,按照一個或者多個列隊結(jié)果進(jìn)行分組,然后對每個組執(zhí)行聚合操作。

案例實操:

(1)計算emp表每個部門的平均工資

hive (default)> select t.deptno, avg(t.sal) avg_sal from emp t group by t.deptno;

(2)計算emp每個部門中每個崗位的最高薪水

hive (default)> select t.deptno, t.job, max(t.sal) max_sal from emp t group byt.deptno, t.job;

Having語句

1.having與where不同點

(1)where針對表中的列發(fā)揮作用,查詢數(shù)據(jù);having針對查詢結(jié)果中的列發(fā)揮作用,篩選數(shù)據(jù)。

(2)where后面不能寫分組函數(shù),而having后面可以使用分組函數(shù)。

(3)having只用于group by分組統(tǒng)計語句。

2.案例實操

(1)求每個部門的平均薪水大于2000的部門

求每個部門的平均工資

hive (default)> select deptno, avg(sal) from emp group by deptno;

求每個部門的平均薪水大于2000的部門

hive (default)> select deptno, avg(sal) avg_sal from emp group by deptno havingavg_sal > 2000;

Join語句

Inner JOIN 內(nèi)連接

SELECT <select_list> FROM Table_A A INNER JOIN Table_B B ON A.Key = B.Key

Left JOIN 左連接

SELECT <select_list> FROM Table_A A LEFT JOIN Table_B B ON A.Key = B.Key

Right JOIN 右連接

SELECT <select_list> FROM Table_A A RIGHT JOIN Table_B B ON A.Key = B.Key

Outer JOIN 滿外連接

SELECT <select_list> FROM Table_A A FULL OUTER JOIN Table_B B ON A.Key = B.Key

Left Excluding JOIN 左外連接

SELECT <select_list> FROM Table_A A LEFT JOIN Table_B B ON A.Key = B.Key WHERE B.Key IS NULL

Right Excluding JOIN 右外連接

SELECT <select_list> FROM Table_A A RIGHT JOIN Table_B B ON A.Key = B.Key WHERE A.Key IS NULL

Outer Excluding JOIN 全外連接

SELECT <select_list> FROM Table_A A FULL OUTER JOIN Table_B B ON A.Key = B.Key WHERE A.Key IS NULL OR B.Key IS NULL

笛卡爾積

1.笛卡爾集會在下面條件下產(chǎn)生

(1)省略連接條件

(2)連接條件無效

(3)所有表中的所有行互相連接

2.案例實操

hive (default)> select empno, dname from emp, dept;

案例模板:

dept.txt

10 ACCOUNTING 1700 20 RESEARCH 1800 30 SALES 1900 40 OPERATIONS 1700--建表語句 CREATE TABLE IF NOT EXISTS emp(empno int,ename string,job STRING,mgr int,hiredate string,sal double,comm double,deptno int ) ROW FORMAT DELIMITED FIELDS TERMINATED BY 't';--導(dǎo)入語句 load DATA LOCAL INPATH '/home/dept.txt' OVERWRITE INTO TABLE dept;

epm.txt

7369 SMITH CLERK 7902 1980-12-17 800.00 20 7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30 7521 WARD SALESMAN 7698 1981-2-22 1250.00 500.00 30 7566 JONES MANAGER 7839 1981-4-2 2975.00 20 7654 MARTIN SALESMAN 7698 1981-9-28 1250.00 1400.00 30 7698 BLAKE MANAGER 7839 1981-5-1 2850.00 30 7782 CLARK MANAGER 7839 1981-6-9 2450.00 10 7788 SCOTT ANALYST 7566 1987-4-19 3000.00 20 7839 KING PRESIDENT 1981-11-17 5000.00 10 7844 TURNER SALESMAN 7698 1981-9-8 1500.00 0.00 30 7876 ADAMS CLERK 7788 1987-5-23 1100.00 20 7900 JAMES CLERK 7698 1981-12-3 950.00 30 7902 FORD ANALYST 7566 1981-12-3 3000.00 20 7934 MILLER CLERK 7782 1982-1-23 1300.00 10--建表語句 CREATE TABLE IF NOT EXISTS dept(deptno int,dname STRING,loc int ) ROW FORMAT DELIMITED FIELDS TERMINATED BY 't';--導(dǎo)入語句 load DATA LOCAL INPATH '/home/epm.txt' OVERWRITE INTO TABLE emp;

loc.txt

1700 Beijing 1800 London 1900 Tokyo--建表語句 create table if not exists location( loc int, loc_name string ) row format delimited fields terminated by 't' location '/hive_test';--導(dǎo)入語句 LOAD data local inpath '/home/loc.txt' into table location;

排序

全局排序(Order By)

Order By:全局排序,一個Reducer

1.使用 ORDER BY 子句排序

ASC(ascend): 升序(默認(rèn))

DESC(descend): 降序

2.ORDER BY 子句在SELECT語句的結(jié)尾

3.案例實操

(1)查詢員工信息按工資升序排列

hive (default)> select * from emp order by sal;

(2)查詢員工信息按工資降序排列

hive (default)> select * from emp order by sal desc;

按照別名排序

按照員工薪水的2倍排序

hive (default)> select ename, sal*2 twosal from emp order by twosal;

多個列排序

按照部門和工資升序排序

hive (default)> select ename, deptno, sal from emp order by deptno, sal ;

每個MapReduce內(nèi)部排序(Sort By)

Sort By:每個Reducer內(nèi)部進(jìn)行排序,對全局結(jié)果集來說不是排序。

1.設(shè)置reduce個數(shù)

hive (default)> set mapreduce.job.reduces=3;

2.查看設(shè)置reduce個數(shù)

hive (default)> set mapreduce.job.reduces;

3.根據(jù)部門編號降序查看員工信息

hive (default)> select * from emp sort by empno desc;

4.將查詢結(jié)果導(dǎo)入到文件中(按照部門編號降序排序)

hive (default)> insert overwrite local directory '/opt/module/datas/sortby-result'select * from emp sort by deptno desc;

分區(qū)排序(Distribute By)

Distribute By:類似MR中partition,進(jìn)行分區(qū),結(jié)合sort by使用。

注意,Hive要求DISTRIBUTE BY語句要寫在SORT BY語句之前。

對于distribute by進(jìn)行測試,一定要分配多reduce進(jìn)行處理,否則無法看到distribute by的效果。

案例實操:

(1)先按照部門編號分區(qū),再按照員工編號降序排序。

hive (default)> set mapreduce.job.reduces=3; hive (default)> insert overwrite local directory '/opt/module/datas/distribute-result' select * from emp distribute by deptno sort by empno desc;

Cluster By

當(dāng)distribute by和sorts by字段相同時,可以使用cluster by方式。

cluster by除了具有distribute by的功能外還兼具sort by的功能。但是排序只能是升序排序,不能指定排序規(guī)則為ASC或者DESC。

1)以下兩種寫法等價

hive (default)> select * from emp cluster by deptno; hive (default)> select * from emp distribute by deptno sort by deptno;

注意:按照部門編號分區(qū),不一定就是固定死的數(shù)值,可以是20號和30號部門分到一個分區(qū)里面去。


分桶及抽樣查詢

分桶表數(shù)據(jù)存儲

分區(qū)針對的是數(shù)據(jù)的存儲路徑;分桶針對的是數(shù)據(jù)文件。

分區(qū)提供一個隔離數(shù)據(jù)和優(yōu)化查詢的便利方式。不過,并非所有的數(shù)據(jù)集都可形成合理的分區(qū),特別是之前所提到過的要確定合適的劃分大小這個疑慮。

分桶是將數(shù)據(jù)集分解成更容易管理的若干部分的另一個技術(shù)。

1.先創(chuàng)建分桶表,通過直接導(dǎo)入數(shù)據(jù)文件的方式

(1)數(shù)據(jù)準(zhǔn)備

1001 ss1 1002 ss2 1003 ss3 1004 ss4 1005 ss5 1006 ss6 1007 ss7 1008 ss8 1009 ss9 1010 ss10 1011 ss11 1012 ss12 1013 ss13 1014 ss14 1015 ss15 1016 ss16

(2)創(chuàng)建分桶表

create table stu_buck(id int, name string)clustered by(id) into 4 bucketsrow format delimited fields terminated by 't';

(3)查看表結(jié)構(gòu)

hive (default)> desc formatted stu_buck; Num Buckets: 4

(4)導(dǎo)入數(shù)據(jù)到分桶表中

hive (default)> load data local inpath '/opt/module/datas/student.txt' into tablestu_buck;

(5)查看創(chuàng)建的分桶表中是否分成4個桶,如圖6-7所示

發(fā)現(xiàn)并沒有分成4個桶。是什么原因呢?

2.創(chuàng)建分桶表時,數(shù)據(jù)通過子查詢的方式導(dǎo)入

(1)先建一個普通的stu表

create table stu(id int, name string)row format delimited fields terminated by 't';

(2)向普通的stu表中導(dǎo)入數(shù)據(jù)

load data local inpath '/opt/module/datas/student.txt' into table stu;

(3)清空stu_buck表中數(shù)據(jù)

truncate table stu_buck;select * from stu_buck;

(4)導(dǎo)入數(shù)據(jù)到分桶表,通過子查詢的方式

insert into table stu_buckselect id, name from stu;

(5)發(fā)現(xiàn)還是只有一個分桶,如圖6-8所示

(6)需要設(shè)置一個屬性

hive (default)> set hive.enforce.bucketing=true;hive (default)> set mapreduce.job.reduces=-1;hive (default)> insert into table stu_buckselect id, name from stu;

(7)查詢分桶的數(shù)據(jù)

hive (default)> select * from stu_buck;OKstu_buck.id stu_buck.name1004 ss41008 ss81012 ss121016 ss161001 ss11005 ss51009 ss91013 ss131002 ss21006 ss61010 ss101014 ss141003 ss31007 ss71011 ss111015 ss15

分桶抽樣查詢

對于非常大的數(shù)據(jù)集,有時用戶需要使用的是一個具有代表性的查詢結(jié)果而不是全部結(jié)果。Hive可以通過對表進(jìn)行抽樣來滿足這個需求。

查詢表stu_buck中的數(shù)據(jù)。

hive (default)> select * from stu_buck tablesample(bucket 1 out of 4 on id);

注:tablesample是抽樣語句,語法:TABLESAMPLE(BUCKET x OUT OF y) 。

y必須是table總bucket數(shù)的倍數(shù)或者因子。hive根據(jù)y的大小,決定抽樣的比例。例如,table總共分了4份,當(dāng)y=2時,抽取(4/2=)2個bucket的數(shù)據(jù),當(dāng)y=8時,抽取(4/8=)1/2個bucket的數(shù)據(jù)。

x表示從哪個bucket開始抽取,如果需要取多個分區(qū),以后的分區(qū)號為當(dāng)前分區(qū)號加上y。例如,table總bucket數(shù)為4,tablesample(bucket 1 out of 2),表示總共抽取(4/2=)2個bucket的數(shù)據(jù),抽取第1(x)個和第3(x+y)個bucket的數(shù)據(jù)。

注意:x的值必須小于等于y的值,否則

FAILED: SemanticException [Error 10061]: Numerator should not be bigger than denominator in sample clause for table stu_buck

總結(jié)

以上是生活随笔為你收集整理的asc desc排序_HIVE的学习之路(六)Hive的分组Join排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。