Apache Hive—DML Select

Select

基本的Select操作
語法結構:

SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
JOIN table_other ON expr
[WHERE where_condition]
[GROUP BY col_list [HAVING condition]]
[CLUSTER BY col_list | [DISTRIBUTE BY col_list] [SORT BY|ORDER BY col_list]]
[LIMIT number]

說明:
1、order by會對輸入做全局排序,因此只有一個reducer,會導致當輸入規模較大時,需要較長的計算時間。
2、sort by不是全局排序,其在數據進入reducer前完成排序。因此,如果用sort by進行排序,並且設置mapred.reduce.task2>1,則sort by只保證每個reducer的輸出有序,不保證全局有序。
3、distribute by(字段)根據指定字段將數據分到不同的reducer,分發算法是hash散列。
4、cluster by(字段)除了具有Distribute by的功能外,還會對該字段進行排序。
如果distribute和sort的字段是同一個時,此時,cluster by=distribute by+sort by

分桶、排序等查詢

cluster by、sort by、distribute by

select * from student cluster by(Sno);

insert overwrite table student_buck
select * from student cluster by(Sno) sort by(Sage); 報錯cluster和sort不能共存

對某列進行分桶的同時,根據玲一行進行排序
insert overwrite table stu_buck
select * from student distribute by(Sno) sort by(Sage asc);

總結:
cluster(分且排序,必須一樣)==distribute(分)+sort(排序)(可以不一樣)
在這裏插入圖片描述
set mapredece.job.reduces;
查看當前分桶情況
在這裏插入圖片描述
set mapredece.job.reduces=3;
改變分桶爲3,修改後查詢當前分桶情況,查詢結果爲3
在這裏插入圖片描述
在這裏插入圖片描述
select * from student cluster by(Sno);
沒有立即返回結果,執行mr程序中
在這裏插入圖片描述
查看執行結果,分桶情況,分爲了3桶,會根據Sno字段進行正序的排序:

  • 一桶:95001、95004、95007、95010、95013、95016、95019、95022
  • 一桶:95002、95005、95008、95011、95014、95017、95020
  • 一桶:95003、95006、95009、95012、95015、95018、95021
    在這裏插入圖片描述
    在這裏插入圖片描述
insert overwrite **local** directory '/root/aaa777'
select * from student cluster by(Sno);

在這裏插入圖片描述
執行完畢。
在這裏插入圖片描述
通過命令cd /aaa777,進入aaa777文件夾下,用ll命令看下查詢結果,分爲三桶,導出了3個文件。
在這裏插入圖片描述
查看第一個文件,都是第一桶的數據。
在這裏插入圖片描述
根據Sno學號進行分桶,根據Sage年齡進行排序,會報錯。cluster和sort不能共存。
在這裏插入圖片描述
可以用distribute by+sort by
在這裏插入圖片描述
可以看到執行結果,第一桶根據年齡做了排序了
在這裏插入圖片描述
order by,根據年齡進行全局排序。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章