Hive的一点认识
Author:杜七
Date:2013.3.21
1,什么是Hive
关于Hive,随便google,都能找到很多,比如看这里.其实,如果你对数据库有过了解,也找到一点SQL,那完全可以简单的把它当数据库,然后可以通过SQL语言来查询数据,就可以了,只不过它是部署在HADOOP上的外层的一个“查询接口”罢了。
2,怎么来用Hive
既然可以把它当数据库,可以用SQL查询,使用它,那就简单了。首先,要理解数据在数据库是怎么样存储的。数据库中,数据是以行列为单位,表为单元来存储的。因此,任何的SQL的查询,都是基于表的,任何行列数据的切割整合。Hive也不例外。
其实,Hive就是把表中的数据,根据列的一些存储特性以及自己的需求,选取出来,有易到难。请记住,是对列的操作。主要涉及以下四种操作:
1)基本查询
这里有一张表-customer_info,存放在一部分客户的信息-两列(name,age),如下:
name age
张三 29
李四 30
王五 31
最简单的,我想找所有的客户名单,就要这样来查:
select name from customer_info;
2)条件查询
基本查询,满足不了有些特定的需求,比如,现在我想找年龄大于30的客户的信息,改怎么做,如下:
select * from customer_info where age>30;
这个例子很简单,只有一个限制条件,然后来查询。其实,在实际的应用过程中,根据不同的需求,添加更多的查询条件都是一样的,只不过,where后面多加几个AND而已。
条件查询,在日常的使用占大多数。
3)关联查询
有些时候,需要的数据不在一张表中,而是分散在几张数据表里面,该怎么办呢?比如,现在还有一张工资表-Salary,如下:
name salary
张三 5000
李四 5500
王五 7000
现在想统计下年龄大于30的员工的薪水是多少?从上面两张表,如果单独来统计,都不行,必须要从customer_info找到年龄大于30的员工,然后salary中找到薪水,两者关联起来。因此,join的操作就用到了。
在日常工作中,join使用的频率最多。上面的统计,如下:
select distinct a.name,b.salary
from
(
select *
from customer_info
where age>30) a
join
(
select *
from salary) b
on a.name=b.name;
这个统计就稍微复杂点了,里面夹杂了基本查询,条件查询,以及关联查询三种。如果这一步写的非常好了以后,基本的Hive的使用,就可以学会一半了。
4)函数的使用
当基本查询,条件查询,关联查询都掌握的时候,可能就可以根据自己的想法提取很多数据了。但是,有的时候,很多需求或者想法,要求的数据比较特别,或者模糊,或者意外,仅仅简单的提取数据还满足不了。比如,想统计“张”姓员工的平均年龄,和平均salary。这用到了统计的一个概念-Average,以及模糊匹配。因此,单单的根据列提取数据,还不行,必须要通过一些特殊的函数来描述需求点,比如:
select AVERAGE(a.age),AVERAGE(b.salary)
from
(
select *
from customer_info
where name like '%张%') a
join
( select *
from salary) b
on a.name=b.name;
上述统计里面,就用到like-模糊匹配,以及AVERAGE()函数,来计算平均值。Hive里面,有一些基本的函数,比如SUBSTR(),COUNT(),SUM()等,除此之外,还有其他人写的UDF包,里面也有一些特别的函数,比如row_number()等等。基于这些函数,对于一般的数据提取,Hive基本都可以满足了。根据自己的经验,关联查询+函数+一点点技巧,可以满足自己大部分的数据提取和处理需求。当然,有些需要深度处理的,可以交给其他的统计软件来处理,比如SAS,R。
3,后记
当然,Hive仅有的Join只支持等值连接,以及还有很多其他SQL该有的功能也不支持,但是,基于HADOOP的hive,对于大数据量可以快速的提取,还是很赞的。
在日常的数据分析工作中,快速提取基本的数据是前提,基础数据有了以后,再根据自己的想法通过一些统计软件来处理,得到自己想要的结果才是根本。如果想通过Hive就做Hive+SAS或者Hive+R的工作,未免也太Happy了。