hive排序语句

Order,Sort,Cluster,and Distribute By
该文档主要描述select语句下使用Order by、Sort by、cluster、distribute by的使用
Order By的语法:
在hive中,order by语法和sql语法类似:
colOrder(ASC | DESC) 正序还是倒序
colNullOrder (NULLS FIRST | NULLSLAST) 空值放在哪最前还是最后 --(Note: Available in Hive 2.1.0 and later)
orderBy ORDER BY colNullOrder? (’,’ colName colOrder? colNullOrder?)*
query SELECT expression (’,’ expression) * FROM src orderBy;
order by字句有一些限制,在strict模式下(如:hive.mapred.mode=strict),order by后面需要有limit字句。如:
select * from sometable order by somColasc nulls firs limit 5
如果hive.mapred.mode=nonstrict,那么limit字句不是必须的。需要注意的式:Order by 字句会只有一个reduce来完成排序,所以如果行数很大,使用order by 字句会花费相当多的时间来运行。性能低下。
默认排序规则是:asc
在2.1.0之后,order by的空值若使用asc那么是nulls first。若使用desc那么默认是nulls last。
Sort By语句:
colOrder (ASC | DESC)
sortBy SORT BY colName colOrder? (’,’ colName colOrder?)*
query SELECT expression (’,’ expression) * FROM src sortBy
sort by 不是全局培训,其在数据进入reduce前完成排序
因为,如果用sort by进行排序,并且设置 mapred.reduce>1,则sort by 只保证每个reduce的输出有序,不保证全局有序。
sort by 不受hive.mapred.mode是否为strict,nostrict的影响
sort by 的数据只能保证在同一reduce中的数据可以按指定字段排序。
使用sort by 你可以指定执行的reduce个数(set mapred.reduce.tasks=),
对输出的数据在金乡归并排序,既可以得到全部结果。
注意:可以用limit字句大大减少数据量。使用limit n后,传送到reduce端(单机)的数据记录数就减少到n* (map个数)。否则由于数据过大可能出不了结果。
Sort By 和 Order By 的不同
SELECT key,value FROM src SORT BY key ASC,value DESC
该查询如果有两个reduce那么结果会是这样的:
0 5
0 3
3 6
9 1

0 4
0 3
1 1
2 5
distribute by
按照指定的字段对数据进行划分到不同的输出reduce /文件中。
insert overwrite local directory ‘/hom/hadoop/out’ select * from test order by name distribute by lengtah(name)
此方法会根据name的长度划分到不同的reduce中,最终输出到不同的文件中。
length是内建函数,也可以指定其他的函数或者使用自定义函数。
Cluster By
cluster by 除了具有distribute by 的功能外还兼具sort by 的功能。
但是排序只能是正序排序,不能指定排序规则为asc或者desc。
如果想要指定排序规则,可以使用DISTRIBUTE BY col1 SORT BY col1 ASC来完成。
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;
FROM(
FROM py_users
MAP (py_users.userid, py_users.date)
USING ‘map_script’
AS c1,c2,c3
DISTRIBUTE BY c2
SORT BY c2,c1)map_output
INSERT OVERWRITE TABLE py_users_reduce
REDUCE(map_output.c1,map_output.c2,map_output.c3)
USING ‘reduce_script’
AS date,count;

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值