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; //该模式下必须指定一个静态分区