面试中问到了这些问题,今天特意全方位的总结一下。另外,数据思维比技术更重要。
1.Order by
Hive中的order by跟传统的sql语言中的order by作用一样,会对查询的结果做一次全局排序。所以只有hive的sql中制定了order by所有的数据都会到同一个reducer进行处理(不管有多少map,也不管文件有多少的block只会启动一个reducer)。但是对于大量数据这将会消耗很长的时间去执行。
如果指定了hive.mapred.mode=strict(默认值是nonstrict),就必须指定limit来限制输出条数,因为所有的数据都会在同一个reducer端进行,数据量大的情况下可能不能出结果。
select product,quantity from sales_product limit 2000 order by product
2.Sort by
Hive中指定了sort by,那么在每个reducer端都会做排序,也就是说保证了局部有序(每个reducer出来的数据是有序的,但是不能保证所有的数据是有序的,除非只有一个reducer)。
优点:执行了局部排序之后可以为接下去的全局排序提高不少的效率。
3.distribute by
ditribute by是控制map的输出在reducer是如何划分的,举个栗子,一张表,product是指这个sales_table产品,quantity是这个销量。
select product,quantity from sales_table distribute by product
那么同一类product将会发送到一个reducer处理,如果product之间的销量差距很大,这样会造成数据倾斜。
4.cluster by
cluster by的功能就是distribute by和sort by相结合,如
select product, district,quantity from sales_table cluster by product
等同于
select product, district,quantity from sales_table distribute by product sort by product