hive中mr个数判断

对于 JOIN 操作:

Map:
以 JOIN ON 条件中的列作为 Key,如果有多个列,则 Key 是这些列的组合
以 JOIN 之后所关心的列作为 Value,当有多个列时,Value 是这些列的组合。在 Value 中还会包含表的 Tag 信息,用于标明此 Value 对应于哪个表。
按照 Key 进行排序。
Shuffle:
根据 Key 的值进行 Hash,并将 Key/Value 对按照 Hash 值推至不同对 Reduce 中。
Reduce:
Reducer 根据 Key 值进行 Join 操作,并且通过 Tag 来识别不同的表中的数据。

对于Group by操作:

Map:
以 Group by条件中的列作为 Key,如果有多个列,则 Key 是这些列的组合
根据key值聚合
按照 Key 进行排序。
Shuffle:
根据 Key 的值进行 Hash,并将 Key/Value 对按照 Hash 值推至不同对 Reduce 中。
Reduce:
Reducer 根据 Key 值进行 聚合 操作。

select sum(case
when aunit = 1 then
ariod
when aunit = 2 then
ariod * 24
else
0
end),
count(distinct a.id),
count(id1)
from (select distinct id1, id
from adm.mid_inf_all_day
where dt = ‘2017-06-30’
and to_date(req_dte) >= ‘2017-04-01’
and to_date(req_dte) <= ‘2017-06-30’) a
inner join (select *
from adm.usr_info
where dt = ‘2017-06-30’
and to_date(req_dte) <= ‘2017-06-30’) b
on a.id = b.id;
这个语句,按照我的理解是只会有两个mapreduce,a表中的distinct会产生一个,两个表进行关联时会再产生一个,而select后做聚合的那段“sum(case
when aunit = 1 then
ariod
when aunit = 2 then
ariod * 24
else
0
end),
count(distinct a.id),
count(id1)”只是计算部分,不应该起mapreduce,但是在实际执行时,却发现是会起3个mapreduce;
然后经过查看执行计划 explain …代码部分…,然后查看了下log;
第三个mapreduce应该就是在"sum(case
when aunit = 1 then
ariod
when aunit = 2 then
ariod * 24
else
0
end),
count(distinct a.id),
count(id1)"这一段,因为如果"select a,count(1) from b group by a"是会起一个mapreduce,因为后面的group by,因为group by是要做一个排序的;

最终的结论是hive自身对于没有group by的聚合,其实内部解析时,相当于是按照某个固定值进行的group by,所以有没有group by最终都会按照有group by去分配任务;

join语句需要注意的地方
首先是Hive中的连接查询只支持相等连接而不支持不等连接查询:

//有效的连接查询,相等连接查询
SELECT a.* FROM a JOIN b ON (a.id = b.id AND a.department = b.department)
//无效的连接查询,Hive不支持不等连接查询
SELECT a.* FROM a JOIN b ON (a.id <> b.id)
如果每个表都只使用相同的列join连接,Hive将只生成一个map/reduce作业;如果一个表使用了两个以上的字段,则会生成2个以上的mr任务:

//由于 join 子句中只使用了表b的key1列,该查询转换为一个作业
SELECT a.val, b.val, c.val FROM a JOIN b ON (a. key = b.key1) JOIN c ON (c. key = b.key1)
//由于表b的key1列用在第一个 join 子句中,key2列用在第二个 join 子句中,该查询被转换为两个作业,
//第一个作业执行表a和b的连接查询,第二个作业将第一个作业的结果与第二个 join 子句进行连接查询
SELECT a.val, b.val, c.val FROM a JOIN b ON (a. key = b.key1) JOIN c ON (c. key = b.key2)
Join连接的顺序是不可以交换的,无论是LEFT还是RIGHT连接都是左结合的。

你可能感兴趣的:(大数据,hive,mr个数)