hive简介
hive是基于hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据表,并提供类SQL查询功能(类SQL的本质就是将SQL转换成MapReduce程序);主要用于做离线数据分析,比直接用MapReduce程序开发效率更高。
hive与hadoop的关系
hive利用HDFS存储数据,利用MapReduce查询分析数据
hive的元数据(hive与HDFS的映射信息)存储
hive存储元数据有两种,一种是自带的derby(德比),一种是第三方数据库(常用MySQL)。
虽然derby是自带的,但是在不同的路径下启动hive时,都会生成一套当前路径下操作的元数据,无法实现共享,而使用第三方数据库就不会出现这种弊端,所以实际开发中使用第三方数据库。
hive中创建的数据库存储在MySQL中的"DBS"表中,hive中创建的数据表存储在MySQL中的"TBLS"表中,hive中创建的数据表的字段存储在MySQL中的"COLUMNS_V2"表中。
hive中的数据存储位置
默认情况下hive中的数据库会存储在"/user/hive/warehouse/数据库名.db",如果hive要与hadoop文件系统中的文件成功映射(即将文件存储在"/user/hive/warehouse/数据库名.db/表名"目录下),则必须创建一个与待映射文件数据类型一一对应的数据表,数据表的一个个字段对应文件的一列,并且要根据hadoop数据文件中的分隔符类型,指定与之对应的字段分隔符。
hive与hadoop数据文本的映射的实质就是创建一个与待映射文件完全对应的数据表(这个表其实就是hadoop文件系统中的一个数据文件)后,将这个待映射文件存放到这个数据表下面,在操作该数据表时,hadoop文件系统会根据HQL语句转化成对应的MapReduce程序,将操作结果显现出来。
hive中的分隔符的使用
1.row format delimited fields terminated by char("char"表示文本中字段的分隔符)
2.row format delimited collection items terminated by char("char"表示文本中集合中字段的分隔符)
3.row format delimited map keys terminated by char("char"表示文本中Map集合中的字段的分隔符)
hive中默认的字符分隔符
hive建表时默认使用的分割符是"\001"(使用vi编译器Ctrl+v,然后Ctrl+a),若在建表时没有指明分隔符,load文本时,如果文本的分隔符如果是"\001",则可以成功映射,如果分隔符符不是"\001",程序不会报错,但是不能成功映射,显示的结果为"null"。
hive中的分区表
hive使用partitioned by(字段 数据类型)来创建分区表,其中"字段"是用来分区的,他不能是数据表中已经存在的字段,因为它是虚拟的字段(其实它就相当于是一个文件夹,在加载数据时,就将加载的数据存储在指定的这个分区的目录下),不存放任何数据(分区表中的数据不能使用"-put"命令来映射数据表,因为路径不对,缺少"字段"这一级目录(即使添加"字段",这一级目录,也不能使用"-put"),加载分区表数据只能使用load指令)。此外,partitioned by()中有几个字段,就是几级分区表。
创建分区表:
create table book (id bigint, name string) partitioned by (pubid int) row format delimited fields terminated by ','
分区表数据加载
load data local inpath '/book.txt' overwrite into table book partition (pubid=1)
hive创建分桶表
分桶表在创建前,需要开启分桶表功能("set hive.enforce.bucketing = true"开启分桶功能,"set mapreduce.job.reduces=4"指定分桶的份数),
hive使用clustered by(字段),关键字来创建分桶表,分桶表创建的时候,分桶的字段必须是表中已经存在的字段(他们就是要分开的字段)。
hive中的分桶表可以提高查询处理效率(将多个数据表中共同的字段当成分桶字段)
create table book (id bigint, name string) clustered by (id) into 4 backets row format delimited fields terminated by ','
分桶表数据加载
分桶表的数据的导入使用"insert……select"语句加载数据如
insert overwrite table book select * from book1 cluster by(id);