欢迎投稿

今日深度:

Hive使用,

Hive使用,


 

Hive数据库和表

Hive在HDFS上的默认存储路径

Hive的数据都是存储在HDFS上的,默认有一个根目录,在hive-site.xml中,由参数hive.metastore.warehouse.dir指定。默认值为/user/hive/warehouse.

 

Hive中的数据库(Database)

进入Hive命令行,执行show databases;命令,可以列出hive中的所有数据库,默认有一个default数据库,进入Hive-Cli之后,即到default数据库下。 
使用use databasename;可以切换到某个数据库下,同mysql;

 


 

Hive中的数据库在HDFS上的存储路径为: 
${hive.metastore.warehouse.dir}/databasename.db

 

比如,名为lxw1234的数据库存储路径为:

 

/user/hive/warehouse/lxw1234.db

 

创建Hive数据库

使用HDFS超级用户,进入Hive-Cli,语法为:

 


 

比如,创建名为lxw1234的数据库:

 


 

创建时候可以指定数据库在HDFS上的存储位置。

 

注意:使用HDFS超级用户创建数据库后,该数据库在HDFS上的存储路径的属主为超级用户,如果该数据库是为某个或者某些用户使用的,则需要修改路径属主,或者在Hive中进行授权。

 

修改数据库

修改数据库属性:


 

修改数据库属主:


 

删除数据库


 

默认情况下,Hive不允许删除一个里面有表存在的数据库,如果想删除数据库,要么先将数据库中的表全部删除,要么可以使用CASCADE关键字,使用该关键字后,Hive会自己将数据库下的表全部删除。RESTRICT关键字就是默认情况,即如果有表存在,则不允许删除数据库。

 

Hive中的表(Table)

查看所有的表

进入Hive-Cli,使用use databasename;切换到数据库之后,执行show tables;即可查看该数据库下所有的表:

 


 

表的存储路径

默认情况下,表的存储路径为:

 

${hive.metastore.warehouse.dir}/databasename.db/tablename/

 

可以使用desc formatted tablename;命令查看表的详细信息,其中包括了存储路径:

 

Location: hdfs://cdh5/hivedata/warehouse/lxw1234.db/lxw1234

 

内部表和外部表

Hive中的表分为内部表(MANAGED_TABLE)和外部表(EXTERNAL_TABLE)。

 

我们的使用场景: 
每天将收集到的网站日志定期流入HDFS文本文件,一天一个目录;

 

在Hive中建立外部表作为源表,通过添加分区的方式,将每天HDFS上的原始日志映射到外部表的天分区中;

 

在外部表(原始日志表)的基础上做大量的统计分析,用到的中间表、结果表使用内部表存储,数据通过SELECT+INSERT进入内部表。

 

创建表

创建表的语法选项特别多,这里只列出常用的选项。

 

其他请参见Hive官方文档:

 

Hive官方文档

 

以一个例子来说吧:

 


 

关键字EXTERNAL: 
表示该表为外部表,如果不指定EXTERNAL关键字,则表示内部表

 

关键字COMMENT 
为表和列添加注释

 

关键字PARTITIONED BY 
表示该表为分区表,分区字段为day,类型为string

 

关键字ROW FORMAT DELIMITED 
指定表的分隔符,通常后面要与以下关键字连用:

 

FIELDS TERMINATED BY ‘,’ //指定每行中字段分隔符为逗号

 

LINES TERMINATED BY ‘\n’ //指定行分隔符

 

COLLECTION ITEMS TERMINATED BY ‘,’ //指定集合中元素之间的分隔符

 

MAP KEYS TERMINATED BY ‘:’ //指定数据中Map类型的Key与Value之间的分隔符

 

举个例子:

 


 

要加载的文本数据为:

 

biansutao ‘数学’:80,’语文’:89,’英语’:95

 

jobs ‘语文’:60,’数学’:80,’英语’:99

 

关键字STORED AS 
指定表在HDFS上的文件存储格式,可选的文件存储格式有:

 

TEXTFILE //文本,默认值

 

SEQUENCEFILE // 二进制序列文件

 

RCFILE //列式存储格式文件 Hive0.6以后开始支持

 

ORC //列式存储格式文件,比RCFILE有更高的压缩比和读写效率,Hive0.11以后开始支持

 

PARQUET //列出存储格式文件,Hive0.13以后开始支持

 

关键词LOCATION 
指定表在HDFS上的存储位置。

 

Hive视图和分区

同关系型数据库一样,Hive中也支持视图(View)和分区(Partition),但与关系型数据库中的有所区别,本文简单介绍Hive中视图和分区的示例。

 

在真实业务场景下,视图的应用比较少,分区使用的非常多,因此建议对分区这块多花的时间来了解。

 

Hive中的视图

和关系型数据库一样,Hive中也提供了视图的功能,注意Hive中视图的特性,和关系型数据库中的稍有区别:

 

只有逻辑视图,没有物化视图; 
视图只能查询,不能Load/Insert/Update/Delete数据; 
视图在创建时候,只是保存了一份元数据,当查询视图的时候,才开始执行视图对应的那些子查询;

 

创建视图


 

例如:

 


 

删除视图

DROP VIEW IF EXISTS v_lxw1234;

 

修改视图


 

更多关于Hive视图的介绍,请参考官方文档:

 

Hive视图官方文档

 

Hive中的表分区

Hive中的表分区比较简单,就是将同一组数据放到同一个HDFS目录下,当查询中过滤条件指定了某一个分区值时候,只将该分区对应的目录作为Input,从而减少MapReduce的输入数据,提高查询效率。

 

创建分区表


 

在创建表时候,使用PARTITIONED BY关键字来指定该表为分区表,后面括号中指定了分区的字段和类型,分区字段可以有多个,在HDFS中对应多级目录。 
比如,上面的表t_lxw1234分区month=’2015-06’,day=’2015-06-15’对应HDFS上的路径为:/user/hive/warehouse/default.db/t_lxw1234/month=2015-06/day=2015-06-15/,当查询中指定了month=’2015-06’ AND day=’2015-06-15’,MapReduce直接从该目录中读取数据,如果只指定了month=’2015-06’,那么MapReduce将/month=2015-06/下所有的子目录都作为Input。

 

添加分区

使用INSERT添加分区: 
往分区中追加数据:

 


 

覆盖分区数据:

 


 

使用ALTER TABLE添加分区:

 


 

查看分区对应的HDFS路径

使用命令 show partitions t_lxw1234; 查看表的所有分区:

 


 

使用desc formatted t_lxw1234 partition (month = ‘2015-01’ , day = ‘2015-01-25′); 
查看该分区的详细信息,包括该分区在HDFS上的路径:

 

Location: hdfs://namenode/user/hive/warehouse/default.db/t_lxw1234/month=2015-01/day=2015-01-25/

 

删除分区

可以使用 ALTER TABLE t_lxw1234 DROP PARTITION (month = ‘2015-01’, day = ‘2015-01-25’);

 

删除一个分区;

 

同内部表和外部表,如果该分区表为外部表,则分区对应的HDFS目录数据不会被删除。

 

更多关于分区的介绍,可参考官方文档:

 

Hive中复制一张表

Hive中有时候会遇到复制表的需求,复制表指的是复制表结构和数据。

 

如果是针对非分区表,那很简单,可以使用CREATE TABLE new_table AS SELECT * FROM old_table;

 

那么如果是分区表呢?

 

首先想到的办法可能是:

 

先创建一张和old_table结构相同的new_table,包括分区;可以使用CREATE TABLE new_table LIKE old_table;

 

接下来使用动态分区,把old_table的数据INSERTnew_table中。

 

这个方法当然可以,但可能不是最快的。

 

其实可以这样做:

 

看例子:

 

有一张分区表t1,只有两个分区,每个分区中都有一条数据,如下:

 


 

创建一张相同表结构的新表t2;

 


 

使用hadoop fs -cp命令把t1对应HDFS目录的所有文件夹复制到t2对应的HDFS目录下:

 


 

在Hive用使用MSCK REPAIR TABLE t2;修复新表t2的分区元数据;

 


 

OK,新表t2已经复制好了,它和t1有着相同的表结构,分区结构,分区以及数据。

 

 

 

www.htsjk.Com true http://www.htsjk.com/hive/39414.html NewsArticle Hive使用,   Hive数据库和表 Hive在HDFS上的默认存储路径 Hive的数据都是存储在HDFS上的,默认有一个根目录,在 hive-site.xml 中,由参数 hive.metastore.warehouse.dir 指定。默认值为/user/hive/ware...
相关文章
    暂无相关文章
评论暂时关闭