Hive相关随笔

1).Hive中Select Top N的实现

Hive中使用 Order by + Limit 可以很容易地实现Select Top N

但是在Hive中Order by只能使用1个Reduce,如果表的数据量很大,那么Order by就会力不从心。相对的,Sort by可以启动多个Reduce,每个Reduce做局部排序。

从执行计划explain中可以看出Sort by Limit N启动了两个MR Job。第一个Job是在每个Reduce中做局部排序,然后分别取Top N。假设启动了M个reduce,第二个Job再对M个Reduce分别局部排好序的总计M * N条数据做全局排序,再取最终的Top N,从而得到想要的结果。这样就可以大大提高Select Top N的效率。

set mapred.reduce.tasks=3;
select * from tea sort by age limit 3;

2).hive中的分号字符

分号是SQL语句结束标记,在HiveQL中也是,但是在HiveQL中,对分号的识别没有那么智慧,例如:

hive> select concat(';','a');
--会报异常NoViableAltException(-1@[]),解决方案:

hive> select concat('\073','a');
--分号的ASCII值是59,八进制为073.只能使用八进制,对于十六进制无效
--concat(str1,str2)作用为拼接字符串

3).Hive客户端默认配置

以下操作均可在$HIVE_HOME/bin/.hiverc文件中保存,设置为默认参数

set hive.mapred.mode=strict;
//开启strict模式,以下情况报错:(1)没有limit限制的order by语句.(2)动态分区插入

set hive.cli.print.current.db=true;
//显示当前工作的数据库

set hive.cli.print.header=true;
//显示列名

set mapred.reduce.tasks=3;
//设置reduce的个数

set hive.exec.reducers.bytes.per.reducer;
//多少字节开一个reducer,默认256000000

set hive.exec.dynamic.partition.mode=strict;
//该模式下必须指定一个静态分区

 

posted @ 2015-09-01 16:36 skyl夜 阅读(...) 评论(...) 编辑 收藏