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;
2万+

被折叠的 条评论
为什么被折叠?



