hive的四个by

1.order by col_list:
     全局排序,默认为升序asc ,因此只有一个reducer,只有一个reduce task的结果
比如文件名是000000_0,会导致当输入规模较大时,需要较长的计算时间。
    如果指定了hive.mapred.mode=strict(默认值是nonstrict),这时就必须指定limit来限制输出条数,原因是:所有的数据都会在同一个reducer端进行,数据量大的情况下可能不能出结果,那么在这样的严格模式下,必须指定输出的条数。 对被排序列进行全排序,且只启动一个MR任务。

例如:stu:按照年龄排序

1

select from stu_test order by age desc;

结果:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

id name sex age

11 wf f 24

10 wb m 23

15 ch f 22

8  cl f 22

5  ll f 21

12 jj m 21

13 yy m 20

7  xh f 20

3  ww m 20

9  fj m 19

6  hl f 19

2  ls m 19

14 ld f 18

1  zs m 18

4  zq f 18

2.sort by col_list :

局部排序,其在数据进入reducer前完成排序。因此,如果用sort by 进行排序,并且设置mapred.reduce.tasks>1,
则sort by 只保证每个reducer的输出有序,不保证全局排序

在每一个reducetask中,每一个小的输出结果排序,但是当reducetask的个数为1的话和order by 的排序结果一致
注意:sort by 指定的字段仅仅是用于排序的字段,不用于分reducetask输出结果,最终的输出文件中的结果是随机生成的

1

select from stu_test sort by age desc;

结果:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

id name sex age

11 wf f 24

10 wb m 23

15 ch f 22

8  cl f 22

5  ll f 21

12 jj m 21

13 yy m 20

7  xh f 20

3  ww m 20

9  fj m 19

6  hl f 19

2  ls m 19

14 ld f 18

1  zs m 18

4  zq f 18

正常(set mapreduce.job.reduces=1)结果和sort by 的结果一致
如果设置reduce task 个数为3的话: set mapreduce.job.reduces=3,此时不一致

1

2

set mapreduce.job.reduces=3

select from stu_test sort by age desc;

结果:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

id name sex age

10 wb m 23

15 ch f 22

8 cl f 22

5 ll f 21

7 xh f 20

9 fj m 19

6 hl f 19

 

11 wf f 24

12 jj m 21

3 ww m 20

2 ls m 19

14 ld f 18

4 zq f 18

 

13 yy m 20

1 zs m 18

随机生成3个文件,然后在每个文件中进行排序。

3.distribute by col_list:

根据指定的字段将数据分到不同的reducer,且分发算法是hash散列
类似于分桶的概念 按照指定的distribute by 字段和 设置的reducetask的个数进行取余分组,但是并没有排序,只是分,没有排序
select * from stu_test distribute by age desc; 错误,不能使用desc,因为它不是排序的意思

1

2

set mapreduce.job.reduces=3

select from stu_test distribute by age;

结果:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

id name sex age

000000_0 age%3=0

14 ld f 18

1  zs m 18

4  zq f 18

12 jj m 21

11 wf f 24

5  ll f 21

000000_1 age%3=1

15 ch f 22

9  fj m 19

6  hl f 19

2  ls m 19

8  cl f 22

000000_1 age%3=2

13 yy m 20

7  xh f 20

3  ww m 20

10 wb m 23

 

1

2

3

set mapreduce.job.reduces=2

 

select from stu_test distribute by age;  

 

结果:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

000000_0 age%2=0

15 ch f 22

14 ld f 18

13 yy m 20

11 wf f 24

8 cl f 22

7 xh f 20

4 zq f 18

3 ww m 20

1 zs m 18

000000_0 age%2=1

12 jj m 21

6 hl f 19

10 wb m 23

9 fj m 19

5 ll f 21

2 ls m 19

4.cluster by col_list :

除了具有distribute by 的功能外,还会对该字段进行排序
cluster by = distribute by+sort by

cluster by id = distribute by id +sort by id
注意:1)cluster by 和sort by 不可以同时使用
2)当分组字段和排序字段是同一个字段的时候 cluster by id = distribute by id +sort by id
不是同一个字段的时候 请不要使用 cluster by id

1

select from stu_test cluster by age;  

结果:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

id name sex age

000000_0 age%3=0

14 ld f 18

4  zq f 18

1  zs m 18

12 jj m 21

5  ll f 21

11 wf f 24

000000_1 age%3=1

6  hl f 19

2  ls m 19

9  fj m 19

15 ch f 22

8  cl f 22

000000_1 age%3=2

3  ww m 20

13 yy m 20

7  xh f 20

10 wb m 23


附加group by与distribute by的区别

    都是按key值划分数据 都使用reduce操作 **唯一不同的是,distribute by只是单纯的分散数据,distribute by col – 按照col列把数据分散到不同的reduce。而group by把相同key的数据聚集到一起,后续必须是聚合操作

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值