转载请注明出处:https://blog.csdn.net/l1028386804/article/details/80559811
group by、 order by、 join、 distribute by、 sort by、 cluster by、 union all
order by: 全局排序
sort by:每个分组内部排序
MapReduce
count(*)、 count(1)、 count(col)
sum(可转化成数字的值)返回bigint
sum(col) + 1 //直接执行会报错,sum(col)返回bigint,1为int类型,直接相加会报错
sum(col) + cast(1 as bigint) //正常执行
avg(可转化成数字的值)返回double
count(distinct col)
按照某些字段排序
例如:
select col1, other...
from table
where condition
order by col, col2 [asc | desc]
按照某些字段的值进行分组,有相同值放到一起
例如:
select col1 [, col2], count(1), sel_expr(聚合操作)
from table
where condition
group by col1[,col2]
[having]
select 后面非聚合列必须出现在group by中
除了普通列就是一些聚合操作
group by后面也可以跟表达式,比如substr(col)
使用了reduce操作,受限于reduce数量,设置reduce参数mapred.reduce.task
输出文件个数与reduce数相同,文件大小与reduce处理的数据量有关
set mapred.reduce.task = 5;
set hive.groupby.skewindata = true;
select m.col as col, m.col2 as col2, n.col3 as col3
from
(select col, col2
from test
where...(map端执行)
)m(左表)
[left outer | right outer | left semi] join
n(右表)
on m.col = n.col
where condition(reduce端执行)
set hive.optimize.skewjoin = true;
set hive.auto.convert.join = true;
hive.mapjoin.smalltable.filesize默认值是25mb
第二种方式,手动指定
select /*+mapjoin(n)*/ m.col, m.col2, n.col3 from m
join n
on m.col = n.col
对于每一个表(table)或者分区,Hive可以进一步组成桶,也就是说桶是更为细粒度的数据范围划分
Hive是针对某一列进行分桶
Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录放在哪个桶中
create table bucketed_user
(
id int,
name string
)
cluster by(id) sorted by(name) into 4 buckets
row format delimited
fields terminated by '\t'
stored as textfile;
set hive.enforce.bucketing=true;
select * from bucketed_user tablesample(bucket 1 out of 2 on id);
bucket join
set hive.optimize.bucketmapjoin=true;
set hive.optimize.bucketmapjoin.sortedmerge=true;
set hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;
连接两个在(包含连接列)相同列上划分了桶的表,可以使用map端连接(map-side join)高效的实现。比如join操作。对于join操作两个表有一个相同的列,如果对这两个表都进行了桶操作,那么将保存相同列值的桶进行join操作就可以,可以大大减少join的数据量
sort by col
按照col列把数据排序
select col1, col2 from m
distribute by col1
sort by col1 asc, col2 desc;
两者结合出现,确保每个reduce的输出都是有序的
把有相同值的数据聚集在一起,并排序
效果
cluster by col 等同于 distribute by col order by col
多个表的数据合并成一个表, hive不支持union,只支持union
样例:
select col
from(
select a as col from t1
union all
select b as col from t2
)tmp