hive中order by,sort by, distribute by, cluster by作用以及用法

1. order by

    Hive中的order by跟传统的sql语言中的order
by作用是一样的,会对查询的结果做一次全局排序,所以说,只有hive的sql中制定了order
by所有的数据都会到同一个reducer进行处理(不管有多少map,也不管文件有多少的block只会启动一个reducer)。但是对于大量数据这
将会消耗很长的时间去执行。

   
这里跟传统的sql还有一点区别:如果指定了hive.mapred.mode=strict(默认值是nonstrict),这时就必须指定limit
来限制输出条数,原因是:所有的数据都会在同一个reducer端进行,数据量大的情况下可能不能出结果,那么在这样的严格模式下,必须指定输出的条数。

2. sort by

    Hive中指定了sort
by,那么在每个reducer端都会做排序,也就是说保证了局部有序(每个reducer出来的数据是有序的,但是不能保证所有的数据是有序的,除非只有一个reducer),好处是:执行了局部排序之后可以为接下去的全局排序提高不少的效率(其实就是做一次归并排序就可以做到全局排序了)。

3. distribute by和sort by一起使用

    ditribute by是控制map的输出在reducer是如何划分的,举个例子,我们有一张表,mid是指这个store所属的商户,money是这个商户的盈利,name是这个store的名字

store:

mid money name
AA 15.0 商店1
AA 20.0 商店2
BB 22.0 商店3
CC 44.0 商店4

    执行hive语句:

select mid, money, name from store distribute by mid sort by mid asc, money asc


们所有的mid相同的数据会被送到同一个reducer去处理,这就是因为指定了distribute by
mid,这样的话就可以统计出每个商户中各个商店盈利的排序了(这个肯定是全局有序的,因为相同的商户会放到同一个reducer去处理)。这里需要注意
的是distribute by必须要写在sort by之前。

4. cluster by

    cluster by的功能就是distribute by和sort by相结合,如下2个语句是等价的:

    

select mid, money, name from store cluster by mid
select mid, money, name from store distribute by mid sort by mid

    如果需要获得与3中语句一样的效果:

select mid, money, name from store cluster by mid sort by money

    注意被cluster by指定的列只能是降序,不能指定asc和desc。

本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1697301

时间: 2024-09-26 00:14:49

hive中order by,sort by, distribute by, cluster by作用以及用法的相关文章

python中List的sort方法指南_python

简单记一下python中List的sort方法(或者sorted内建函数)的用法.  List的元素可以是各种东西,字符串,字典,自己定义的类等. sorted函数用法如下: sorted(data, cmp=None, key=None, reverse=False)  其中,data是待排序数据,可以使List或者iterator, cmp和key都是函数,这两个函数作用与data的元素上产生一个结果,sorted方法根据这个结果来排序. cmp(e1, e2) 是带两个参数的比较函数, 返

hive中的排序和分组

order by order by 会对输入坐全局排序,因此 只有一个reducer(多个reducer会无法保证全局有序)只有一个reducer,会导致当输入规模较大时,需要较长的计算时间. set hive.mapred.mode =nonstrict;(default value/默认值) set hive.mapred.mode =strict; order by 和数据库中的order by 功能一致,按照某一项或几项的排序输出. 与数据库中order by 的区别在于在 hive.m

Hive中的排序语法

ORDER BY hive中的ORDER BY语句和关系数据库中的sql语法相似.他会对查询结果做全局排序,这意味着所有的数据会传送到一个Reduce任务上,这样会导致在大数量的情况下,花费大量时间. 与数据库中 ORDER BY 的区别在于在hive.mapred.mode = strict模式下,必须指定 limit 否则执行会报错. hive> set hive.mapred.mode=strict; hive> select * from test order by id; FAILE

大数据-大牛们,谁知道怎么查看hive中的sql有没有用到索引?

问题描述 大牛们,谁知道怎么查看hive中的sql有没有用到索引? 我通过CREATE INDEX ind_test_id_bit on table test(id) AS 'BITMAP' WITH DEFERRED REBUILD;alter index ind_test_id_bit on test rebuild;在test表建立了一个id列的索引,但是explain select count(1) from test where id = 38188211;看执行计划中并没有体现出引用

用Java集合中的Collections.sort方法如何对list排序(两种方法)_java

第一种是list中的对象实现Comparable接口,如下: /** * 根据order对User排序 */ public class User implements Comparable <user> { private String name; private Integer order; public String getName() { return name; } public void setName(String name) { this.name = name; } publi

Hive中如何确定map数

Hive 是基于 Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的 sql 查询功能,可以将 sq l语句转换为 MapReduce 任务进行运行.当运行一个 hql 语句的时候,map 数是如何计算出来的呢?有哪些方法可以调整 map 数呢? 本文测试集群版本:cdh-4.3.0 . hive 默认的 input format 在 cdh-4.3.0 的 hive 中查看 hive.input.format 值(为什么是hive.input.format?

Hive中如何查看数据来源文件和具体位置

通常用户在HIVE中用SELECT语句出来结果,无法确定结果是来自哪个文件或者具体位置信息,HIVE中考虑到了这点,在Virtual Column虚列中可以指定三个静态列: 1.  INPUT__FILE__NAME        map任务读入File的全路径 2.  BLOCK__OFFSET__INSIDE__FILE       如果是RCFile或者是SequenceFile块压缩格式文件则显示Block file Offset,也就是当前快在文件的第一个字偏移量,如果是TextFil

hive中执行sql语句出现的问题

The expression after ELSE should have the same type as those after THEN: "bigint" is expected but "i hive中执行sql语句: select pc.category_id, sum(case when t.so_month between 3 and 5 then t.order_item_num else 0 end) as spring, sum(case when t.

mysql中order by与group by的区别

以下是对mysql中order by与group by的区别进行了详细的分析介绍,需要的朋友可以过来参考下   order by 从英文里理解就是行的排序方式,默认的为升序. order by 后面必须列出排序的字段名,可以是多个字段名.      group by 从英文里理解就是分组.必须有"聚合函数"来配合才能使用,使用时至少需要一个分组标志字段.  什么是"聚合函数"?  像sum().count().avg()等都是"聚合函数"  使用