[TOC]
## select
* 基本的Select操作
* 語法結構
~~~
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
[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.tasks>1`,則sort by只保證每個reducer的輸出有序,不保證全局有序**
3. distribute by(字段)(分發)根據指定的字段將數據分到不同的reducer,且分發算法是hash散列。
4. Cluster by(字段)(桶) 除了具有Distribute by的功能外,還會對該字段進行排序。
因此,如果分桶和sort字段是同一個時,此時,`cluster by = distribute by + sort by`
分桶表的作用:最大的作用是用來提高join操作的效率;
(思考這個問題:
`select a.id,a.name,b.addr from a join b on a.id = b.id;`
如果a表和b表已經是分桶表,而且分桶的字段是id字段
做這個join操作時,還需要全表做笛卡爾積嗎?)
**注意:在hive中提供了一種“嚴格模式”的設置來阻止用戶執行可能會帶來未知不好影響的查詢**
設置屬性hive.mapred.mode 為strict能夠阻止以下三種類型的查詢:
1. 除非在where語段中包含了分區過濾,否則不能查詢分區了的表。這是因為分區表通常保存的數據量都比較大,沒有限定分區查詢會掃描所有分區,耗費很多資源。
不允許:`select *from logs;`
允許:`select * from logs where day=20151212;`
2. ? 包含order by,但沒有limit子句的查詢。因為order by 會將所有的結果發送給單個reducer來執行排序,這樣的排序很耗時
3. ? 笛卡爾乘積;簡單理解就是JOIN沒帶ON,而是帶where的
**案例**
~~~
create external table student_ext(Sno int,Sname string,Sex string,Sage int,Sdept string)
row format delimited
fields terminated by ','
location '/stu';
~~~
~~~
//where查詢
select * from student_ext where sno=95020;
//分組
select sex,count(*) from student_ext group by sex;
~~~
~~~
//分區,排序,但是這個只有1個reduce,沒意義
select * from student_ext cluster by sex;
~~~
~~~
//設置4個reduce
//這樣每個reduce自己內部會排序
hive> set mapred.reduce.task=4;
hive> create table tt_1 as select * from student_ext cluster by sno;
//查看結果,這個tt_1文件夾下面有4個文件
dfs -cat /user/hive/warehouse/db1.db/tt_1/000000_0;
//這個結果和上面一樣,分成4個reduce
create table tt_2 as select * from student_ext distribute by sno sort by sno;
//排序可以按照其他方式排序
create table tt_3 as select * from student_ext distribute by sno sort by sage;
~~~
- linux
- 常用命令
- 高級文本命令
- 面試題
- redis
- String
- list
- hash
- set
- sortedSet
- 案例-推薦
- java高級特性
- 多線程
- 實現線程的三種方式
- 同步關鍵詞
- 讀寫鎖
- 鎖的相關概念
- 多線程的join
- 有三個線程T1 T2 T3,保證順序執行
- java五種線程池
- 守護線程與普通線程
- ThreadLocal
- BlockingQueue消息隊列
- JMS
- 反射
- volatile
- jvm
- IO
- nio
- netty
- netty簡介
- 案例一發送字符串
- 案例二發送對象
- 輕量級RPC開發
- 簡介
- spring(IOC/AOP)
- spring初始化順序
- 通過ApplicationContextAware加載Spring上下文
- InitializingBean的作用
- 結論
- 自定義注解
- zk在框架中的應用
- hadoop
- 簡介
- hadoop集群搭建
- hadoop單機安裝
- HDFS簡介
- hdfs基本操作
- hdfs環境搭建
- 常見問題匯總
- hdfs客戶端操作
- mapreduce工作機制
- 案列-單詞統計
- 局部聚合Combiner
- 案列-流量統計(分區,排序,比較)
- 案列-倒排索引
- 案例-共同好友
- 案列-join算法實現
- 案例-求topN(分組)
- 自定義inputFormat
- 自定義outputFormat
- 框架運算全流程
- mapreduce的優化方案
- HA機制
- Hive
- 安裝
- DDL操作
- 創建表
- 修改表
- DML操作
- Load
- insert
- select
- join操作
- 嚴格模式
- 數據類型
- shell參數
- 函數
- 內置運算符
- 內置函數
- 自定義函數
- Transform實現
- 特殊分割符處理
- 案例
- 級聯求和accumulate
- flume
- 簡介
- 安裝
- 常用的組件
- 攔截器
- 案例
- 采集目錄到HDFS
- 采集文件到HDFS
- 多個agent串聯
- 日志采集和匯總
- 自定義攔截器
- 高可用配置
- 使用注意
- sqoop
- 安裝
- 數據導入
- 導入數據到HDFS
- 導入關系表到HIVE
- 導入表數據子集
- 增量導入
- 數據導出
- 作業
- 原理
- azkaban
- 簡介
- 安裝
- 案例
- 簡介
- command類型單一job
- command類型多job工作流flow
- HDFS操作任務
- mapreduce任務
- hive腳本任務
- hbase
- 簡介
- 安裝
- 命令行
- 基本CURD
- 過濾器查詢
- 系統架構
- 物理存儲
- 尋址機制
- 讀寫過程
- Region管理
- master工作機制
- 建表高級屬性
- 與mapreduce結合
- 協處理器
- 點擊流平臺開發
- 簡介
- storm
- 簡介
- 安裝
- 集群啟動及任務過程分析
- 單詞統計
- 并行度
- ACK容錯機制
- ACK簡介