日期:2014-05-16  浏览次数:20527 次

hive功能简介
Hive提供了类SQL语法的功能,可通过它来检索Hadoop存储数据,查询操作是基于MapReduce来完成的

Hive功能

1.通过select语句查询指定column的数据
2.通过where语句过滤查询条件
3.通过group by语句将查询结果进行分组
4.执行join查询操作
使用写有Join操作的查询语句时有一条原则:应该将条目少的表/子查询放在Join操作符的左边。原因是在Join操作的Reduce阶段,位于Join操作符左边的表的内容会被加载进内存,将条目少的表放在左边,可以有效减少发生OOM错误的几率。
inner join
    SELECT sales.*, things.* FROM sales JOIN things ON (sales.id = things.id);
outer join
    SELECT sales.*, things.* FROM sales LEFT OUTER JOIN things ON (sales.id = things.id);
    SELECT sales.*, things.* FROM sales RIGHT OUTER JOIN things ON (sales.id = things.id);
    SELECT sales.*, things.* FROM sales FULL OUTER JOIN things ON (sales.id = things.id);

semi join:等同于in函数
    SELECT * FROM things LEFT SEMI JOIN sales ON (sales.id = things.id);
    相当于sql语句:SELECT * FROM things WHERE things.id IN (SELECT id from sales);
map join
Join操作在map阶段完成,不再需要reduce操作,因此map join不能结合RIGHT OUTER JOIN和FULL OUTER JOIN使用(需要reduce进行聚合)
    SELECT /*+ MAPJOIN(things) */ sales.*, things.* FROM sales JOIN things ON (sales.id = things.id);
*前提:在join字段,join左边的记录集合(sales)是join右边(things)的子集*,例如:
sales    things
1               1
2               2
3               3
                 4
                 ...
5.管理数据库表格(create,drop,alter)
6.将查询结果保存到其他Table
通过insert语句:
    INSERT OVERWRITE TABLE target
    PARTITION (dt='2010-01-01')
    SELECT col1, col2
    FROM source;

注意:和关系数据库不同,insert操作不是追加记录,而是将新的记录覆盖掉以前的记录,因此OVERWRITE关键字是必须的
通过CTAS语句:
    CREATE TABLE target
    AS
    SELECT col1, col2
    FROM source;

7.将查询结果保存到HDFS
    INSERT OVERWRITE DIRECTORY '/path' SELECT...
8.将查询结果保存到本地目录
    INSERT OVERWRITE LOCAL DIRECTORY 'path' SELECT...
9.自定义MapReduce脚本用于查询

使用Hive需注意

    查询出的数据可能会有延迟
    不能对数据执行更新和删除操作
Hive is not designed for online transition processing and does not offer real-time queries and row level
updates.it is best used for batch jobs over large sets of immutable data

Hive数据模型

按照粒度由粗到细,Hive数据可划分成如下几个单元
DataBase、Tables:概念同关系数据库
其中Table又分为managed table和external table
删除external table的时候,只会删除表格的元数据信息,而不会删除表格的数据
删除managed table的时候,元数据和数据都会删除

Partitions:
当表格数据量较大时,可对表格进行分区处理(Partition),便于局部数据的查询操作,如按时间分区、按地域分区等,将具有相同性质的数据存储到同一磁盘块上,从而加快查询效率。

Buckets:
Table所存储的数据进行分区(Partition)之后,每个Partition还可划分成更细的粒度以水平切片的方式进行存储,被划分后的数据单元称为Bucket或Cluster
bucket多用于提高map-join的效率
a mapper working on a bucket of the left table only needs to load the corresponding buckets of the right table to perform the join

Hive语法

DDL
(1)、定义表格:
CREATE TABLE page_view(viewTime INT, userid BIGINT,
    page_url STRING, referrer_url STRING,
   &