#Hive的本质就是MapReduce #设置reduce个数 set mapreduce.job.reduces=num  //设置num数量的reduce #查看设置reduce个数 set mapreduce.job.reduces #1.Order by 全局排序 只有一个ReduceTask,是对所有的数据排序,结果是所有数据是有序的。自定义Reduce数量是无效的,只有一个reduce。效率很低,在数据量很大的情况下,只有一个reduce干活是运行不了的 #2.sort by 部分排序(每个reduce内部排序) sort by 为每个reduce产生一个排序文件。每个reduce内部进行排序,对全局的结果集来说不是有序。如果只写sort by 的话,那么就是随机分区排序的,如果需要定义按照哪个字段来分区,就需要用到distribute by 。这两者是结合使用的。 #3.distribute by 分区排序 分区和排序都是在shuffle阶段完成的,分区是在shuffle中的Maptask阶段完成的,排序是在maptask中完成,也在reducetask中完成。当在执行SQL语句的时候,底层调用了Mapreduce,如果只是写了sort by 的话,那么就是随机分区的。如果需要自定义字段分区排序(某个特定行到对应的reduce),此时就需要distribute by 。distribute类似MR中的partition分区。distribute by的分区规则是根据分区字段的hash码与reduce的个数进行取模,相同的为同一分区再进行排序。当全局排序的时候用这个就没有意义了,因为reducetask只有一个,所有只会有一个分区。所以distribute by只有结合部分排序才有意义。这两者结合使用对区域内的数据进行升序降序排列。 #4.cluster by  当distribute by 和 sort by 的字段相同时,可以使用cluster by 。 cluster by 就是 distribute by 和 sort by 的组合,但是只能默认升序。

精彩内容

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: