SELECT count(DISTINCT orderid) FROM test.subOrderAllDetail
map 阶段的key 会全部汇总在一个reduce 上,导致一个reduce 处理所有数据。reduce 个数只有一个。不管你怎么设置参数:set mapred.reduce.tasks=100,实际执行任务的reduce 只有一个。
优化:
SELECT count(orderid)
FROM
(SELECT DISTINCT orderid
FROM test.subOrderAllDetail)tmp;
map 阶段对key 进行去重,在不同的task 上去重。之后发送到不同的reduce,reduce 个数不一定只有一个。可以通过set mapred.reduce.tasks=n 设置。
从而达到并行执行。
网友评论