[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简介