Hive学习之Hive基本概念及实践

       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中的数据被组织为:

  • 数据库:分隔表等数据单元,防止命名冲突的命名空间。
  • 表:拥有相同Schema的同类数据单元。例如表page_views,该表的每行可以包含下面的列(schema):
    • Timestamp:INT类型,对应页面被浏览时的Unix时间戳。
    •  Userid:BIGINT类型,定义了浏览页面的用户。
    •  Page_url:STRING类型,页面的位置。
    •  IP:STRING类型,请求该页面的IP地址。

  • 分区:每个表可以有一个或者多个分区键以决定数据如何存储。除了作为存储单元,分区也允许用户有效地确定满足一定条件的行。假设存在一个STRING类型的日期分区和STRING类型的国家分区。每个分区键的唯一值定义了表的一个分区,例如所有的属于“2009-12-23”的“US”数据是page_views表的一个分区。因此,如果只分析2009-12-23的“US”数据,可以只在相关的分区上执行查询,这样就大大地加快了分析速度。但是名为2009-12-23的分区并不意味着该分区包含全部或者仅该日期的数据,分区以日期命名是为了方便,确保分区名称和数据内容的关系是用户的工作。分区列是虚拟列,不是数据的一部分而是在加载时导。
  • 桶(或簇):每个分区的数据可能基于某些列的哈希值依次分到桶里面。比如page_views可能使用userid进行分桶,userid是表的一列而不是分区列。桶可以有效地对数据进行抽样检查。

      不是必须对表进行分区或者分桶,但它们允许系统在查询处理过程中修剪大量数据,进而加快查询的执行。

      在介绍了上面的基本概念后,对于非常熟悉数据库的人来说前三个概念,即数据库、表、分区都不难于理解,但本人对分区却不是很熟悉,所以接下来要执行一些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

你可能感兴趣的:(hive,cli,hive分区,延迟,hive桶)