Hive SQL的排序

Order By

在HSQL中的Order By类似于在SQL中的Order By。在严格模式下(hive.mapred.mode=strict),order by 必须和limit一起使用,如果hive.mapred.mode=nonstrict,order by就可以单独使用。
为什么在严格模式下,order by和limit必须一起使用呢?原因是为了进行整体输出排序,必须使用一个reducer进行输出排序,如果输出的行数太多,单个reducer会花很长的时间才能完成。

#测试Hive的hive.mapred.mode
hive> set hive.mapred.mode;
hive.mapred.mode=nonstrict
select id, name from test_transform order by id;
1   snow
2   feng
3   wind
hive> set hive.mapred.mode=strict;
hive>  select id, name from test_transform order by id;
FAILED: SemanticException 1:45 Order by-s without limit are disabled for safety reasons. If you know what you are doing, please make sure that hive.strict.checks.large.query is set to false and that hive.mapred.mode is not set to 'strict' to enable them.. Error encountered near token 'id'

一般通过列的名字来配置列,不能通过位置,但是在Hive.0.11.0(包含)以上,通过以下的配置可以用位置来配置列。
对于HIve 0.11.0到2.1.X,设置hive.groupby.orderby.position.alias为true(默认是false)
对于Hive 2.2.0以上,设置hive.orderby.position.alias为true(默认是true)

#通过位置来配置列的测试
hive > set hive.groupby.orderby.position.alias;
hive.groupby.orderby.position.alias=false
hive> select id, name from test_transform order by 1 asc;
3   wind
2   feng
1   snow
#这时hive.groupby.orderby.position.alias为false,所以排序不起作用
hive> set hive.groupby.orderby.position.alias=true;
hive> set hive.groupby.orderby.position.alias;
hive.groupby.orderby.position.alias=true
select id, name from test_transform order by 1 asc;
1   snow
2   feng
3   wind
select id, name from test_transform order by 1 desc;
3   wind
2   feng
1   snow

默认的order by的排序是升序
在Hive 2.1.0以上,在order by中可以配置NULL排序。对于升序,默认NULL排序是NULLS FIRST。对于降序,默认NULL排序是NULLS LAST。

#测试数据
hive> select id, name from test_transform;
OK
1   snow
2   feng
3   wind
NULL    order
#默认的升序,默认是的NULLS FIRST
hive> select id, name from test_transform order by id;
NULL    order
1   snow
2   feng
3   wind
#默认的升序,NULL排序是NULLS LAST
hive> select id, name from test_transform order by id NULLS LAST;
1   snow
2   feng
3   wind
NULL    order
#降序排列,NULL排序是默认的NULLS LAST
hive> select id, name from test_transform order by id desc;
3   wind
2   feng
1   snow
NULL    order
#降序排序,NULL排序是NULLS FIRST
hive> select id, name from test_transform order by id desc NULLS FIRST;
NULL    order
3   wind
2   feng
1   snow

在Hive 3.0.0以上版本,在subqueries和views中没有limit的Order by将会被optimizer(优化器)移除,为了禁用它,设置hive.remove.orderby.in.subquery为false。

Sort By

在发送行到一个reducer之前,Hive使用Sort By中的列进行排序,排序依赖于列的类型,如果列是数值类型,那么排序以数值顺序进行排序。如果列是字符串类型,那么排序以字典顺序进行排序。
在Hive 3.0.0以上,在subqueries和views中没有limit的Order by将会被optimizer(优化器)移除,为了禁用它,设置hive.remove.orderby.in.subquery为false。

Sort By和Order By的区别

Order By是进行输出的整体排序,而Sort By是在每个reducer中的排序,如果有多个reducer,Sort By可能会是部分排序输出。
可能在单列的Sort By和Cluster By的不同上会有些迷惑,不同是:Cluster By根据在Cluster By的列在reducers中分配数据,而Sort By在多个reducers的情况下,是随机分配数据的
Sort By会在每个reducer中根据列进行排序,例如:

select key, value from src sort by key asc, value desc;
#这个查询有两个reducers,那么每个的输出是:
#1
0   5
0   3
3   6
9   1
#2
0   4
0   3
1   1
2   5

Sort By的设置类型

当一个transform之后,变量类型是字符串类型,这意味着数值类型的数据会根据字段顺序进行排序,为了克服这个问题,第二个select在使用sort by之前用cast进行类型转换

FROM (FROM (FROM src
            SELECT TRANSFORM(value)
            USING 'mapper'
            AS value, count) mapped
      SELECT cast(value as double) AS value, cast(count as int) AS count
      SORT BY value, count) sorted
SELECT TRANSFORM(value, count)
USING 'reducer'
AS whatever

Cluster By和Distribute By的语义

Cluster By和Distribute By主要和Transform/Map-Reduce脚本进行使用,但是如果在select中需要一个查询的分区和排序,那么这两个语义是非常有用的。
Cluster By是Distribute By和Sort By的简写。
Hive使用在Distribute By中的列在reducers进行分配数据,拥有相同列值的数据会被分配到同一个reducer中,但是Distribute By并不能保证在Distribute By的列上的排序。
例如:我们根据列x进行Distribute By,下面是5行数据分配到2个reducers

x1
x2
x4
x3
x1

第一个reducer得到:

x1
x2
x1

第二个reducer得到:

x4
x3

拥有x1的行分配到同一个reducer(在第一个reducer),但是并不能保证在临近的位置
但是如果我们使用Cluster By x,那么两个reducers会在x列上进行排序数据。
第一个reducer得到:

x1
x1
x2

第二个reducer得到:

x3
x4

代替使用Cluster By,用户可以使用Distribute By和Sort By,分配列和排序列可以是不同的。通常分配列是排序列中的第一个,但是并不是必须的。

select col1, col2 from t1 cluster by col1;
select col1, col2 from t1 distribute by col1;
select col1, col2 from t1 distribute by col1 sort by col1 asc, col2 desc;
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容

  • 暑假期间,春雨老师带领的博物馆系列活动,百合老师友情赞助,两位老师陪着孩子们一起学知识,做游戏,尝美食。今天,咱就...
    春喜百合阅读 292评论 0 2
  • 概述 使用 JWT 做权限验证,相比 Session 的优点是,Session 需要占用大量服务器内存,并且在多服...
    聪明的奇瑞阅读 3,740评论 6 48
  • 那羊角, 我做了一把梳子, 用来梳心, 心秀成了结, 结梳来了, 就开心了。 阿木2018.5.8
    阿木洛克人阅读 214评论 2 2
  • 秋天的雨,倏忽来,倏忽去。雨点挺大,敲打在厨房的窗上,乒乒乓,乒乒乓,像打击乐,更像心跳。 一边听手机音乐,一边做...
    qqw1阅读 492评论 0 0
  • -01-抉择 一个农民从洪水中救起了他的妻子,他的孩子却被淹死了。 事后,人们议论纷纷。有的说他做得对,因为孩子可...
    动情信条阅读 1,371评论 0 4