Hive简介
Hive是Hadoop的数据仓库工具,可将结构化的数据文件映射为一张表,提供类SQL的查询功能。其本质是将HQL转化为MapReduce程序。
Hive处理的数据存储在HDFS中。
Hive分析数据的默认实现是MapReduce(可以改成Spark)。
Hive执行程序运行在Yarn上。
Hive 适用于数据分析场景以及对实时性要求不高的场合。其优势在于处理大数据,对于小数据处理没有优势,Hive的执行延迟较高(MapReduce 本身具有较高的延迟)。Hive还支持用户自定义函数。
Hive的缺点在于两点:HQL表达能力有限,迭代式算法无法表达(计算结果再次处理),故在数据挖掘方面并不擅长;执行效率较低,生成的MR任务通常不够智能,且调优困难。
Hive为数仓设计,数仓内容为读多写少,因此,Hive中不建议对数据的改写,所有的数据都是在加载的时候确定好的。当然增和删是可以做到的。
Hive 架构
command-line shell:通过 hive 命令行的的方式来操作数据;
thrift/jdbc:通过 thrift 协议按照标准的 JDBC 的方式操作数据;
Metastore: 元数据涉及到:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;
Driver: 主要包括以下四个:
SQL Parser 解析器:将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。
Physical Plan 编译器:将AST编译生成逻辑执行计划。
Query Optimizer 优化器:对逻辑执行计划进行优化。
Execution 执行器:把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/Spark。
索引
Hive没有对数据中的某些Key建立索引。Hive要访问数据中满足条件的特定值时,需要暴力扫描整个数据,因此访问延迟较高。由于 MapReduce 的引入, Hive 可以并行访问数据,因此即使没有索引,对于大数据量的访问,Hive 仍然可以体现出优势。
基础操作
启动hive: bin/hive
显示数据库: show databases;
使用default数据库: use default;
显示default数据库中的表: show tables;
删除已创建的student表: drop table student;
创建student表, 并声明文件分隔符’\t’
create table student(id int, name string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’;
加载/opt/module/datas/student.txt 文件到student数据库表中。
load data local inpath ‘/opt/module/datas/student.txt’ into table student;
执行脚本中的sql (-f)
bin/hive -f /opt/module/datas/hive.sql
不进入hive的交互窗口执行sql语句 (-e)
bin/hive -e “select id from student;”
Hive常见属性
Hive数据仓库位置配置
1)Default数据仓库的最原始位置是在hdfs上的:/user/hive/warehouse路径下。
2)在仓库目录下,没有对默认的数据库default创建文件夹。如果某张表属于default数据库,直接在数据仓库目录下创建一个文件夹。
3)修改default数据仓库原始位置(将hive-default.xml.template如下配置信息拷贝到hive-site.xml文件中)。
1 | <property> |
配置同组用户有执行权限:bin/hdfs dfs -chmod g+w /user/hive/warehouse
查询后信息显示配置
在hive-site.xml文件中添加如下配置信息,就可以实现显示当前数据库,以及查询表的头信息配置。
1 | <property> |
参数配置方式
1.查看当前所有的配置信息: set;
2.参数的配置三种方式
- 配置文件方式
默认配置文件:hive-default.xml
用户自定义配置文件:hive-site.xml
用户自定义配置会覆盖默认配置。另外,Hive也会读入Hadoop的配置,因为Hive是作为Hadoop的客户端启动的,Hive的配置会覆盖Hadoop的配置。配置文件的设定对本机启动的所有Hive进程都有效。
- 命令行参数方式
启动Hive时,可以在命令行添加-hiveconf param=value
来设定参数: bin/hive -hiveconf mapred.reduce.tasks=10;
注意:仅对本次hive启动有效
- 参数声明方式
可以在HQL中使用SET关键字设定参数: hive (default)> set mapred.reduce.tasks=100;
注意:仅对本次hive启动有效。
查看参数设置: hive (default)> set mapred.reduce.tasks;
上述三种设定方式的优先级依次递增。即配置文件 < 命令行参数 < 参数声明
。注意某些系统级的参数,例如log4j相关的设定,必须用前两种方式设定,因为那些参数的读取在会话建立以前已经完成了。
数据类型
基本数据类型
Hive数据类型 | Java数据类型 | 长度 | 例子 |
---|---|---|---|
TINYINT | byte | 1byte有符号整数 | 20 |
SMALINT | short | 2byte有符号整数 | 20 |
INT | int | 4byte有符号整数 | 20 |
BIGINT | long | 8byte有符号整数 | 20 |
BOOLEAN | boolean | 布尔类型,true或者false | TRUE FALSE |
FLOAT | float | 单精度浮点数 | 3.14159 |
DOUBLE | double | 双精度浮点数 | 3.14159 |
STRING | string | 字符系列。可以指定字符集。可以使用单引号或者双引号。 | ‘now is the time’ “for all good men” |
TIMESTAMP | 时间类型 | ||
BINARY | 字节数组 |
复杂数据类型
数据类型 | 描述 | 语法示例 |
---|---|---|
STRUCT | 和c语言中的struct类似,都可以通过“点”符号访问元素内容。例如,如果某个列的数据类型是STRUCT{first STRING, last STRING},那么第1个元素可以通过字段.first来引用。 | struct() |
MAP | MAP是一组键-值对元组集合,使用数组表示法可以访问数据。例如,如果某个列的数据类型是MAP,其中键->值对是’first’->’John’和’last’->’Doe’,那么可以通过字段名[‘last’]获取最后一个元素 | map() |
ARRAY | 数组是一组具有相同类型和名称的变量的集合。这些变量称为数组的元素,每个数组元素都有一个编号,编号从零开始。例如,数组值为[‘John’, ‘Doe’],那么第2个元素可以通过数组名[1]进行引用。 | Array() |