上一节讲述了Hive的基于mysql作为元数据存储的安装
这一节讲解Hive的实战操作
首先要了解hive的数据类型和数据模型
这些可以参考Hive的官方文档
1、Hive创建表并从本地文件导入数据
hive创建表分类
hive的表逻辑上由存储的数据和描述表格中的数据形式的相关元数据组成。表存储的数据存放在分布式文件系统里,例如HDFS,元数据存储在关系数据库里,当我们创建一张hive的表,还没有为表加载数据的时候,该表在分布式文件系统,例如hdfs上就是一个文件夹(文件目录)。Hive里的表有两种类型一种叫托管表,这种表的数据文件存储在hive的数据仓库里,一种叫外部表,这种表的数据文件可以存放在hive数据仓库外部的分布式文件系统上,也可以放到hive数据仓库里(注意:hive的数据仓库也就是hdfs上的一个目录,这个目录是hive数据文件存储的默认路径,它可以在hive的配置文件里进行配置,最终也会存放到元数据库里)
hive创建表
create table test(col string);
在本地创建一个文件test里面保存数字
1、2、3、4、5
本地文件装载到hive表中
Load data local inpath '/home/test/test' into table test;
查询hive表
image.png在hive的数据仓库中会有对应的文件夹信息,理论上一张表对应一个文件夹
image.png创建外部表,并装载数据
create external table test_external(col string) Location '/home/hadoop/external_table';
Load data local inpath '/home/test/test' into table test_external;
创建外部表并装载数据
以上两个操作的区别:
创建外部表时候table之前要加关键字external,同时还要用location命令指定文件存储的路径,如果不使用locaction数据文件也会放置到hive的数据仓库里。
这两种表在使用的区别主drop命令上,drop是hive删除表的命令,托管表执行drop命令的时候,会删除元数据和存储的数据,而外部表执行drop命令时候只删除元数据库里的数据,而不会删除存储的数据。
表的load命令,hive加载数据时候不会对元数据进行任何检查,只是简单的移动文件的位置,如果源文件格式不正确,也只有在做查询操作时候才能发现,那个时候错误格式的字段会以NULL来显示。
分区概念:
分区(partition):hive里分区的概念是根据“分区列”的值对表的数据进行粗略划分的机制,在hive存储上就体现在表的主目录(hive的表实际显示就是一个文件夹)下的一个子目录,这个文件夹的名字就是我们定义的分区列的名字,没有实际操作经验的人可能会认为分区列是表的某个字段,其实不是这样,分区列不是表里的某个字段,而是独立的列,我们根据这个列存储表的里的数据文件。使用分区是为了加快数据分区的查询速度而设计的,我们在查询某个具体分区列里的数据时候没必要进行全表扫描。下面我就举一个分区使用的实例:
注意分区列是独立的列,而不是某个字段
如下建立一张登陆日志表,根据日期分区
create table login_log(uuid bigint,ip string) partitioned by(dt string) row format delimited fields terminated by ',' stored as textfile;
在/home/test/login_log.txt中添加如下数据
10002,106.15.56.23
10008,110.23.56.45
执行导入操作:
load data local inpath '/home/test/login_log.txt' overwrite into table login_log partition (dt=20170517);
导入成功以后进行查询验证,就可以看到对应的结果了
select * from login_log;
Hive交互式命令模式
Hive交互式命令模式常用命令
相对复杂的结构导入到hive
image.png
网友评论