欢迎投稿

今日深度:

Hive 学习笔记,

Hive 学习笔记,


为什么要使用Hive?

       Hive是基于Hadoop的一个数据仓库工具,可以可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询功能。HQL使不熟悉mapreduce 的用户很方便的利用SQL 语言查询,汇总,分析数据,不需开发装们的MapReduce应用。而mapreduce开发人员可以把己写的mapper 和reducer 作为插件来支持Hive 做更复杂的数据分析。

       Hive定义了一个类似于SQL的查询语言:HQL,能够将用户编写的HQL转化为相应的Mapreduce程序基于Hadoop执行。

        Hive是Facebook 2008年8月刚开源的一个数据仓库框架,Hive的目标与 Pig 有相似之处,但它有一些Pig目前还不支持的机制,比如:更丰富的类型系统、更类似SQL的查询语言、Table/Partition元数据的持久化等。

       HIVE它与关系型数据库的SQL 略有不同,但支持了绝大多数的语句如DDL、DML 以及常见的聚合函数、连接查询、条件查询。HIVE不适合用于联机online事务处理,也不提供实时查询功能。它最适合应用在基于大量不可变数据的批处理作业。

       Hive的特点:可伸缩(在Hadoop的集群上动态的添加设备),可扩展,容错,输入格式的松散耦合。

Pig vs. Hive

       Hive更适合于数据仓库的任务,Hive主要用于静态的结构以及需要经常分析的工作。Hive与SQL相似促使 其成为Hadoop与其他BI工具结合的理想交集。Hive要求所有数据必须存储在表中,表必须有模式,而模式由Hive进行管理。但是Hive允许为预先存在于HDFS的数据关联一个模式。所以,数据的加载步骤是可选的。和Pig一样,Hive也不支持低时延查询。

       Pig赋予开发人员在大数据集领域更多的灵活性,并允许开发简洁的脚本用于转换数据流以便嵌入到较大的应用程序。一个Pig Latin程序是相对于输入的一步步操作。其中每一步都是对数据的一个简单的变换。用Pig Latin编程更像在RDBMS中“查询规划器”(query planner)这一层对数据进行操作,查询规划器决定了如何将描述型语句转化为一系列系统化执行的步骤。
       Pig对它所处理的数据要求则宽松得多;可以在运行时定义模式,而且这是可选的。本质上,Pig可以在任何来源的元组上进行操作。(当然数据源必须支持并行的读操作,例如存放在多个文件中)。它使用UDF(User define feature)从原始格式中读取元组。最常用的输入格式使用制表符分隔的字段组成的文本文件。Pig为这种输入提供了内置加载函数。和传统的数据库不同,Pig并不提供专门的数据导入过程将数据加载到RDBMS。在第一步处理中,数据是从文件系统(通常是HDFS中加载的)。
       Pig对复杂、嵌套数据结构的支持也使其不同于处理平面数据类型的SQL。Pig的语言能和UDF及流式操作紧密集成。它的这一能力及其嵌套数据结构,使Pig Latin比大多数SQL的变种具有更强的定制能力。

       Pig相比Hive相对轻量,它主要的优势是相比于直接使用Hadoop Java APIs可大幅削减代码量。正因为如此,Pig仍然是吸引大量的软件开发人员。

       Hive和Pig都可以与HBase组合使用,Hive和Pig还为HBase提供了高层语言支持,使得在HBase上进行数据统计处理变的非常简单。

总结:
       当你想在你的数据上做一些转换,并且不想编写MapReduce jobs就可以用Pig.
       如果你有数据仓库的需求并且你擅长写SQL并且不想写MapReduce jobs就可以用Hive代替。

Hive与HBase

       Hive是建立在Hadoop之上为了减少MapReduce jobs编写工作的批处理系统,HBase是为了支持弥补Hadoop对实时操作的缺陷的项目 。

       Hive适合用来对一段时间内的数据进行分析查询,例如,用来计算趋势或者网站的日志。Hive不应该用来进行实时的查询。因为它需要很长时间才可以返回结果。

Hbase非常适合用来进行大数据的实时查询。Facebook用Hbase进行消息和实时的分析。它也可以用来统计Facebook的连接数。

Hive和Hbase是两种基于Hadoop的不同技术–Hive是一种类SQL的引擎,并且运行MapReduce任务,Hbase是一种在Hadoop之上的NoSQL 的Key/vale数据库。当然,这两种工具是可以同时使用的。就像用Google来搜索,用FaceBook进行社交一样,Hive可以用来进行统计查询,HBase可以用来进行实时查询,数据也可以从Hive写到Hbase,设置再从Hbase写回Hive。

总之:操作RMDB数据库,如果是全表扫描,就用Hive+Hadoop,如果是索引访问,就用HBase+Hadoop 。Hive query就是MapReduce jobs可以从5分钟到数小时不止,HBase是非常高效的,肯定比Hive高效的多。

将查询,计算结果保存到一个新表中

//原始数据表
hive> describe widgets2;
id      int                                         
price   double                              
amount  int  

//目标表创建
hive> CREATE table sales(id int,sales double);

//输出到目标表
hive> INSERT overwrite table sales                                       
    > SELECT w.id AS id,w.price*w.amount AS sales FROM widgets2  w ;

另外还有insert into方法,两者区别在于:
insert overwrite 会覆盖已经存在的数据,我们假设要插入的数据和已经存在的N条数据一样,那么插入后只会保留一条数据;
insert into 只是简单的copy插入,不做重复性校验,如果插入前有N条数据和要插入的数据一样,那么插入后会有N+1条数据;

类似操作在MySQL中有所差别(好像并没有overwrite):

mysql> CREATE table newTable(Name Char(255),Area double);

mysql> INSERT INTO newTable
    -> SELECT c.Name as Name,c.SurfaceArea as Area FROM country c WHERE SurfaceArea>1000000;

Hive与SQL不同的一些习惯

       (1)有一些SQL中的操作,在Hive中却没有,如:Hive不支持INSERT INTO, UPDATE, DELETE操作。不要试图去找这些操作,是没有的,原因就在于Hive设计为“基于大量不可变数据的批处理作业,本质上是一个分布式大数据处理MapReduce工具”,它并不是一个实时online处理工具。

       (2)Hive不支持将数据插入现有的表或分区中,仅支持覆盖重写整个表,如前面举的例子(覆盖了整个sales表):

hive> INSERT overwrite table sales                                       
    > SELECT w.id AS id,w.price*w.amount AS sales FROM widgets2  w ;

       (3)1、Hive不支持等值连接

       SQL中对两表内联可以写成:

第一种方法:(as均可省略)

mysql> select * from table_a as a,table_b  b where a.key = b.key;

第二种方法:join后再select

mysql> select * from table_a a join table_b b on a.key = b.key;

       Hive中只有第二种方法

hive> select * from table_a a join table_b b on a.key = b.key; 

       (4)分号字符
       分号是SQL语句结束标记,在HQL中也是,但是在HQL中,对分号的识别没有那么智能,例如:

select concat(key,concat(';',key)) from dual;

       但HiveQL在解析语句时提示:

FAILED: Parse Error: line 0:-1 mismatched input ‘’ expecting ) in function specification

       解决的办法是,使用分号的八进制的ASCII码进行转义,那么上述语句应写成:

hive> select concat(key,concat('\073',key)) from dual;

HiveQL语法

建立数据表

存储格式

**

参考文献:
(1)CSDN真实的归宿的博客:Hadoop Hive sql语法详解
http://blog.csdn.net/hguisu/article/details/7256833

(2)CSDN rzhzhz的博客:http://blog.csdn.net/rzhzhz/article/details/7557607

www.htsjk.Com true http://www.htsjk.com/hive/37466.html NewsArticle Hive 学习笔记, 为什么要使用Hive? Hive是基于Hadoop的一个数据仓库工具,可以可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询功能。 HQL使不熟悉mapreduce 的用户很方...
相关文章
    暂无相关文章
评论暂时关闭