HIVE基础详解
1.修改配置的三种方法
-
修改 HIVE_HOME/conf/hive-site.xml配置文件
在Hive中,所有的默认配置都在${HIVE_HOME}/conf/hive-default.xml文件中,如果需要对默认的配置进行修改,可以创建一个hive-site.xml文件,所有的配置都是放在标签之间,一个configuration标签里面可以存在多个标签。标签里面就是我们想要设定属性的名称. -
命令行参数
在启动Hive cli的时候进行配置,可以在命令行添加-hiveconf param=value来设定参数,这样设定对本次启动的会话有效,下次启动需要重新配置。
eg:hive --hiveconf mapreduce.job.queuename=zhmqueue -
在已经进入cli时进行参数声明
hive> set mapreduce.job.queuename=zhmqueue;
上述三种设定方式的优先级依次递增。即参数声明覆盖命令行参数,命令行参数覆盖配置文件设定.
2. HIVE数据类型
TINYINT 1byte,-128 ~ 127
SMALLINT 2byte,-32,768 ~ 32,767
INT 4byte -2,147,483,648 ~ 2,147,483,647
BIGINT 8byte -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
BOOLEAN
FLOAT 4byte单精度
DOUBLE 8byte双精度
STRING
TIMESTAMP 时间戳,纳秒精度
DECIMAL 任意精度的带符号小数
CHAR 固定长度字符串
VARCHAR 变长字符串
DATE 日期
复杂类型:
ARRAY:ARRAY类型是由一系列相同数据类型的元素组成,这些元素可以通过下标来访问。比如有一个ARRAY类型的变量fruits,它是由['apple','orange','mango']组成,那么我们可以通过fruits[1]来访问元素orange,因为ARRAY类型的下标是从0开始的;
MAP:MAP包含key->value键值对,可以通过key来访问元素。比如"userlist"是一个map类型,其中username是key,password是value;那么我们可以通过userlist['username']来得到这个用户对应的password;
STRUCT:STRUCT可以包含不同数据类型的元素。这些元素可以通过"点语法"的方式来得到所需要的元素,比如user是一个STRUCT类型,那么可以通过user.address得到这个用户的地址。
CREATE TABLE employees (
name STRING,
salary FLOAT,
subordinates ARRAY<STRING>,
deductions MAP<STRING, FLOAT>,
address STRUCT<street:STRING, city:STRING, state:STRING, zip:INT>
) PARTITIONED BY (country STRING, state STRING)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
lines terminated by "\n";
Array 通过索引访问: select subordinates[0] from employees;
map 通过key 访问: select deductions["a1"] from employees;
struct 通过字段访问: select address.country from employees;
3. HIVE数据模型
1、表:Hive中的表和关系型数据库中的表在概念上很类似,每个表在HDFS中都有相应的目录用来存储表的数据,这个目录可以通过${HIVE_HOME}/conf/hive-site.xml配置文件中的hive.metastore.warehouse.dir属性来配置,这个属性默认的值是**/user/hive/warehouse(这个目录在HDFS上)**,我们可以根据实际的情况来修改这个配置。如果我有一个表wyp,那么在HDFS中会创建/user/hive/warehouse/wyp目录(这里假定hive.metastore.warehouse.dir配置为/user/hive/warehouse);wyp表所有的数据都存放在这个目录中。这个例外是外部表。
2、外部表:Hive中的外部表和表很类似,但是其数据不是放在自己表所属的目录中,而是存放到别处,这样的好处是如果你要删除这个外部表,该外部表所指向的数据是不会被删除的,它只会删除外部表对应的元数据;而如果你要删除表,该表对应的所有数据包括元数据都会被删除。
3、分区:在Hive中,表的每一个分区对应表下的相应目录,所有分区的数据都是存储在对应的目录中。比如wyp表有dt和city两个分区,则对应dt=20131218,city=BJ对应表的目录为/user/hive/warehouse/dt=20131218/city=BJ,所有属于这个分区的数据都存放在这个目录中。
4、桶:对指定的列计算其hash,根据hash值切分数据,目的是为了并行,每一个桶对应一个文件(注意和分区的区别)。比如将wyp表id列分散至16个桶中,首先对id列的值计算hash,对应hash值为0和16的数据存储的HDFS目录为:/user/hive/warehouse/wyp/part-00000;而hash值为2的数据存储的HDFS 目录为:/user/hive/warehouse/wyp/part-00002。
4. HIVE的元数据
Hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。由于Hive的元数据需要不断的更新、修改,而HDFS系统中的文件是多读少改的,这显然不能将Hive的元数据存储在HDFS中。目前Hive将元数据存储在数据库中,如Mysql、Derby中。我们可以通过以下的配置来修改Hive元数据的存储方式。
5. HIVE几种数据导入方式
-
从本地文件系统中导入数据到Hive表
从本地文件系统中将数据导入到Hive表的过程中,其实是先将数据临时复制到HDFS的一个目录下,然后再将数据从那个临时目录下移动到对应的Hive表的数据目录里面。
load data local inpath ‘/本地文件路径’ into table 表名; -
从HDFS上导入数据到Hive表
将数据直接从HDFS上的一个目录移动到相应Hive表的数据目录下
load data inpath ‘hdfs路径’ into table 表名;overwrite into table tableName 与 into table tableName的区别?
overwrite 会清除表中内容,重新导入数据,into不会清除老的数据,追加新的数据 -
从别的表中查询出相应的数据并导入到Hive表中
insert into table 表名1 select id, name, tel from 表名2; -
在创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中
create table 表名1 as select id, name, tel from 表名2;
6.HIVE 几种数据导出方式
-
导出到本地文件系统
insert overwrite local directory ‘/本地路径’ select * from 表名; -
导出到HDFS中
insert overwrite directory ‘/hdfs路径’ select * from 表名; -
导出到Hive的另一个表中
insert into table 表名1 select id, name, tel from 表名2;
7. hive日志配置
修改日志级别:
- 控制台修改: hive --hiveconf hive.root.logger=DEBUG,console,此种方法修改,对本次运行有效。
- 在${HIVE_HOME}/conf/hive-log4j.properties文件中找到hive.root.logger属性,将其修改为 hive.root.logger=DEBUG,console,这种方式修改对所有的用户有效。
hive-log4j.properties说明
系统日志存储: 在hive/conf/hive-log4j.properties文件中记录了Hive日志的存储情况,
默认的存储情况:
hive.root.logger=WARN,DRFA
hive.log.dir= /tmp/hivelog # 默认的存储位置
hive.log.file=hive.log # 默认的文件名
8. SQL与HQL的区别###
- SQL 支持数据库的事务、索引以及更新,HQL不支持数据库的事务、更新,虽然Hive支持建立索引,但是它还不能提升数据的查询速度。
- SQL数据保存本地文件系统,HQL保存在HDFS
- SQL可扩展性低,HQL可扩展性高
- SQL延时低,HQL延时高
- SQL数据规模小,HQL数据规模大
9. HIVE的内部表与外部表的区别
- 未被external修饰的是内部表(managed table),被external修饰的为外部表(external table);
- 内部表数据由Hive自身管理,外部表数据由HDFS管理;
- 内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse),外部表数据的存储位置由自己制定;
- 删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除;
- 对内部表的修改会将修改直接同步给元数据,而对外部表的表结构和分区进行修改,则需要修复(MSCK REPAIR TABLE table_name;)
10. HIVE 数据存储格式
Hive会为每个创建的数据库在HDFS上创建一个目录,该数据库的表会以子目录形式存储,表中的数据会以表目录下的文件形式存储。对于default数据库,默认的缺省数据库没有自己的目录,default数据库下的表默认存放在/user/hive/warehouse目录下。
-
textfile
textfile为默认格式,存储方式为行存储。数据不做压缩,磁盘开销大,数据解析开销大。 -
SequenceFile
SequenceFile是Hadoop API提供的一种二进制文件支持,其具有使用方便、可分割、可压缩的特点。 SequenceFile支持三种压缩选择:NONE, RECORD, BLOCK。 Record压缩率低,一般建议使用BLOCK压缩。 -
RCFile
一种行列存储相结合的存储方式。 -
ORCFile
数据按照行分块,每个块按照列存储,其中每个块都存储有一个索引。hive给出的新格式,属于RCFILE的升级版,性能有大幅度提升,而且数据可以压缩存储,压缩快 快速列存取。 -
Parquet
Parquet也是一种行式存储,同时具有很好的压缩性能;同时可以减少大量的表扫描和反序列化的时间。