Hive是基于Hadoop的数据仓库,而Hadoop为数据的存储和处理提供了很强的水平扩展和容错功能。Hive能够轻松地汇总数据,特定查询和分析大数据,提供了简单的查询语言HiveQL,该语言基于SQL,这使得熟悉SQL的用户可以执行特定查询,容易得汇总和分析数据。同时Hive QL允许map/reduce程序员能够插入定制的mapper和reducer去执行更加复杂的分析,HiveQL的内建功能可能并不支持这些复杂的分析。
Hadoop是一个批处理系统,运行在Hadoop上的作业常常有较高的延迟并且在作业的提交和调度时出现大量的开销。这些导致了Hive查询的延迟往往会很高(分钟),即使数据集非常小(几百兆),因为Hive是建立在Hadoop之上的。所以Hive是不够与Oracle之类的系统相比较的,在Oracle中数据分析是建立在非常小的数据上的,但是分析进行更多次数的迭代,迭代之间的响应时间不超过几分钟。Hive的目标是在小数据集上进行交互式数据浏览、查询或者测试查询时提供可以接受的(不是最佳的)延迟。Hive不适于在线交易处理,也不提供实时查询和行级更新,最好用于不可修改的大数据集上的批量作业,比如web日志。
按照粒度大小的次序,Hive中的数据被组织为:
不是必须对表进行分区或者分桶,但它们允许系统在查询处理过程中修剪大量数据,进而加快查询的执行。
在介绍了上面的基本概念后,对于非常熟悉数据库的人来说前三个概念,即数据库、表、分区都不难于理解,但本人对分区却不是很熟悉,所以接下来要执行一些Hive QL创建表和分区,然后看看在HDFS上是如何存储的。在启动Hadoop后,在命令行执行hive命令,然后输入下面的语句:
hive> createtable page_view(viewtime int, userid bigint, page_url string, ip string comment"Ip address of the user") > comment "This is the page view table" > partitioned by(dt string, country string) > stored as sequencefile; OK Time taken:4.423 seconds
命令行输出信息显示创建表成功,此时执行hadoop fs –lsr /user/hive/warehouse/page_view,命令行没有任何输出,在CLI中执行下面的命令:
hive>describe page_view; OK viewtime int userid bigint page_url string ip string Ip address of the user dt string country string # Partition Information # col_name data_type comment dt string country string Time taken:0.917 seconds, Fetched: 12 row(s)
可以从输出信息中发现分区的信息。上面曾经提到过分区和分区中的数据是用户的工作,所以需要创建分区,指定分区的名称,在CLI中执行下述语句:
hive> altertable page_view add partition (dt='2014-05-24',country='China'); OK Time taken:0.611 seconds
执行成功后再次查看HDFS上的存储情况,可以发现在HDFS上已经创建了目录dt=2014-05-24和country=China,这样就可以将数据加载到这两个目录中,而是否只加载2014-05-24和China的数据就要由我们自己决定了。
hadoop@hadoop~]$ hadoop fs -lsr /user/hive/warehouse/page_view drwxr-xr-x - hadoop supergroup 0 2014-05-24 11:32/user/hive/warehouse/page_view/dt=2014-05-24 drwxr-xr-x - hadoop supergroup 0 2014-05-24 11:32/user/hive/warehouse/page_view/dt=2014-05-24/country=China