HiveSQL以及看书小结

02 Aug 2015

1.写HiveSQL的小结

在taobao的御膳房平台开发已经有些日子了,主要就是用类Hive的SQL做。到目前为止基本都可以运用自如了,该总结下一些 用法及注意点。 这儿是语法的文档。就目前来说最有用的操作子有join,group by, case when,create table as select等。因为这些操作面向的对象都是二维的数据表,而具体的操作则面向基于列或基于行 组成的数据集合。因为每行通常都表示为一条纪录,也可以理解为一个元素,每一列是对这个纪录的描述,那么其实整张表就 可以理解为由这些具有相同维度元素组成的集合。

集合之间的操作无非就是加,减,乘,交。对应起来也就是union, left/right join,无,join。case when,以及where则是 对单个集合自身进行过滤或者转换的操作。

join,group by,case when,create table as 本身基本的用法在文档中已经有说明,毋需多言,但是这些东西在文档中介绍 的时候都是从语法的角度来说的。而这些操作子本身实质操作的对象是数据集,所以如果从集合操作的角度来认识这些操作子 会更能方便使用的。join相关的是left outer join以及right outer join主要是两个集合之间交集的计算,在join的集合间取 出有公共元素组成的集合。left outer join则是以左集合为准取出所有在右集合中包含左集合的元素,如果没有久取出为空值, right outer join与此想反,其实也就是说left outer join是用左集合减去右集合,right outer join 则是右集合减去左集合。

group by是个非常有用的东西,其价值在于能将不同列作为一个key对其分组。Talk is cheap, here is the code. 表名为raw_data_table。

uid age height
12345 22 150
12345 21 160
22234 22 150
1.select uid,count(age),count(height) from raw_data_table group by uid;
2.select uid,count(age),count(height) from raw_data_table group by uid,age;

上述两条sql的区别在于group by的对象,第一条中group by的对象是uid,可以理解为以uid为key,对相同uid的数据分到一起, 进行统计同一个uid的年龄列,身高列的个数统计。第二条语句group by的对象是uid和age,什么意思呢?这儿其实是以uid+age 作为key,对所有的元素进行分组。统计的是每个用户在每个年龄下的信息.

Ref 1: Hive SQL Mannual
Ref 2: Hive SQL GROUP BY