在hive中进行数据处理和查询时,常用又比较生僻sql整理。
group by and having
group by通常会和聚合函数一起使用,按照某一个或者多个列对结果进行分组,然后对每个组进行聚合操作。样例如下:
hive > select year(ymd),avg(price_close) from stocks where exchange = 'NASDAQ' and symbol = 'AAPL' group by year(ymd);
图-group by结果having子句允许用户通过简单语法完成原本需要通过子查询才能对group by 语句产生分组进行条件过滤对任务。针对上面查询语句增加having 语句限制输出结果中年平均收盘大于50。
select year(ymd),avg(price_close) from stocks where exchange = 'NASDAQ' and symbol = 'AAPL' group by year(ymd) having avg(price_close) > 50.0
图-group by having执行结果order by and sort by
hive中order by和其他sql中的定义是一样的,会对查询结果集执行一个全局排序,即会有一个所有的数据通过一个reducer进行处理的过程,对于大数据集,这个过程会消耗太多时间。因为order by执行时间长,如果属性hive.mapred.mode=strict,hive sql语句必须加limit语句进行限制,默认是nonstrict,不会有限制。
含有sort by 的distribute by
默认情况下,MapReduce计算框架会依据map输入的键计算相应哈希值,按照哈希值将键-值对均匀分发到多个reducer中,这样导致使用sort by时,不同reducer的输出内容会有重叠,而如果使用distribute by 可以保证同一个key被分发到同一个reducer中进行处理,然后对同一个reducer进行排序。使用时候需要注意distribute by 语句要写在sort by 语句之前。
图 - distribute by sort bycluster by
cluster by 等价于 distribute by key sort by key
union all
union all 可以将2个或多个表进行合并,每一个union子查询都必需具有相同的列,并且对应的每个字段的字段类型必须是一致的。
网友评论