基本语法格式:
select [all | DISTINCT ] a.id, a.sname, a.age from student a join student02 b on a.id = b.id # 匹配函数 where a.age >=18 # 条件语句 group by a.age having a.age >=18 # 分组,having:分组后的筛选条件 order by a.age # 全局排序 sort by a.age #局部排序,当reducetask = 1 时,功能与order by一致 distribute by a.age # 分桶 a.age % [reducetask的个数]余数一致的分到一个桶里 cluster by a.age #分桶并排序 limit 100 #仅查看结果中的前100行数据
详解举例
匹配函数
1.内连接(inner join)join = inner join
select ... from t1 inner join t2 on t1.id=t2.id;
2.外连接(outer join)
输出结果一般是两个表的所有列
select ... from t1 left outer join t2 on t1.id=t2.id; #左外连接 select ... from t1 right outer join t2 on t1.id=t2.id; #右外连接 select ... from t1 full outer join t2 on t1.id=t2.id; #全外连接
3.半连接(semi join)
输出结果一般是其中一个表的列
select ... from t1 left semi join t2 on t1.id=t2.id; #左半连接,仅输出左表中的数据 select ... from t1 right semi join t2 on t1.id=t2.id; #右半连接,仅输出右表中的数据
注意:
1)join只支持等值连接
原因:map端的key不好设置
select ... from t1 join t2 on t1.id=t2.id; # 支持
select ... from t1 join t2 on t1.id=t2.id+1; # 不支持
2)join只支持and连接,不支持or连接
原因:and连接:map端的key为id+age;但是or连接的话,map端的key设置太复杂;
select ... from t1 join t2 on t1.id=t2.id and t1.age=t2.age; # 支持
select ... from t1 join t2 on t1.id=t2.id+1 or t1.age=t2.age; # 不支持
3)join支持多表关联
多表关联是通过同一个字段(id)关联的时候,只需要一个mr,否则就转换成多个;
select ... from t1
join t2 on t1.id=t2.id
join t3 on t1.id=t3.id; # 支持
排序函数
1.order by(全局排序)
不管reducetask设置为何值,都是对输出结果中的某列进行全局排序;
select ... from student order by age;
2.sort by(局部排序)
当reducetask = 1,相当于全局排序,= order by
当reducetask = 3,将结果随机分成三部分,在每一个部分中进行排序;
select ... from student sort by age;
结果:
0001 张三 15
0002 李四 16
0004 王五 14
0003 孟七 17
0007 黄一 16
0005 李四 19
3.distribute by(分桶不排序)
select ... from student distribute by age; # 此时reducetask = 3
结果:
0001 张三 15 # age%3=0
0002 李四 16 # age%3=1
0005 李六 19
0007 黄一 16
0003 孟七 17 # age%3=2
0004 王五 14
4.cluster by(分桶且排序)
select ... from student cluster by age; # 此时reducetask = 3
结果:
0001 张三 15 # age%3=0
0002 李四 16 # age%3=1
0007 黄一 16
0005 李六 19
0004 王五 14 # age%3=2
0003 孟七 17
注意:
- cluster by 不能与 sort by同时使用;
- 当分桶字段与排序字段一致时,cluster by = distribute by(分桶) + sort by(排序)
- 当分桶字段与排序字段不一致时,不能使用cluster by:
elect ... from student distribute by age sort by id;
结果:
0001 张三 15 # age%3=0
0002 李四 16 # age%3=1
0005 李六 19
0007 黄一 16
0003 孟七 17 # age%3=2
0004 王五 14