Hive
Hive基本概念是一个基于hadoop的数据仓库工具,可以将结构化数据映射成一张数据表,并提供类SQL的查询功能。Hive的意义是什么背景:hadoop是个好东西,但是学习难度大,成本高,坡度陡。意义(目的):降低程序员使用hadoop的难度。降低学习成本。Hive可以对数据进行存储与计算存储使用HDFS存储计算使用MapReduce进行计算。Hive的特性...
Hive基本概念
是一个基于hadoop的数据仓库工具,可以将结构化数据映射成一张数据表,并提供类SQL的查询功能。
Hive的意义是什么
背景:hadoop是个好东西,但是学习难度大,成本高,坡度陡。
意义(目的):降低程序员使用hadoop的难度。降低学习成本。
Hive可以对数据进行存储与计算
存储使用HDFS存储
计算使用MapReduce进行计算。
Hive的特性
1、扩展性 : Hive的扩展性与集群的扩展性相同
2、延展性:Hive支持用户自定义函数,编写符合自己业务需求的函数。
3、容错性:节点出现问题(宕机/断电)SQL仍可完成执行。
Hive缺点
每次的执行开销较大,任务运行时间较长,延时较高。
Hive的内部组成架构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ww0s6L5U-1574233245912)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1574126259456.png)]
元数据:描述数据的数据(属性)
表名称、字段名,字段的数据类型。
内部执行流程
解释器 -> 编译器 -> 优化器 -> 执行器
数据格式:
Hive中没有定义专门的数据格式
数据格式部分自定义:
列分隔符(通常为空格、”\t”、”\x001″)
行分隔符(”\n”)
读取文件数据的方法(Hive 中默认有三个文件格式 TextFile,SequenceFile 以及 RCFile)。
Hive在加载数据的过程就是拷贝数据的过程,不需要特定的转化。不会对数据本身进行任何修改,甚至不会对数据进行扫描。
Hive 中不支持对数据的改写和添加(对文本内数据的添加),
Hive 在加载数据的过程中不会对数据中的某些 Key 建立索引。所以Hive不适合在线数据查询(要求相应速度快)。
总结:hive具有sql数据库的外表,但应用场景完全不同,hive只适合用来做批量数据统计分析。
hive支持的数据格式
可支持Text,
SequenceFile,
ParquetFile,
ORC格式
RCFILE等
Hive元数据
DB、数据库
Table,内部表
External Table,外部表
Partition,分区
Bucket,分桶
Hive安装部署
1、derby版hive直接使用
每个节点自己维护自己的元数据库(derby),导致多个节点之间元数据不共享。
2、mysql共享hive元数据
2.1安装mysql
mysq不推荐使用RPM安装,建议使用yum进行安装
yum install -y mysql mysql-server mysql-devel
/etc/init.d/mysqld start
配置远程连接(root 只用123456密码)
grant all privileges on . to ‘root’@’%’ identified by ‘123456’ with grant option;
配置mysql用户 root 密码是123456
update user set password=password(‘123456’) where user=‘root’;
2.2 安装HIve
现在第一个节点解压hive的安装包。
在解压后的目录conf中修改配置文件
hive-env.sh
配置HADOOP_HOME
配置HIVE_CONF_DIR
hive-site.xml
添加连接Mysql的配置
将解压后的文件夹拷贝到其他节点
配置环境变量
将mysql-connector-java-5.1.38.jar 上传到HIVE的lib目录下。
Hive的访问方式
1、在Hive客户端,配置hive到环境变量的前提下,在节点的任意位置 直接数据hive + 回车
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1BmryL2V-1574233245913)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1574208461234.png)]
2、
启动hiveserver2 服务
hive --service hiveserver2
进行连接
进入beelin的shell窗口
连接hiveserver2服务
!connect jdbc:hive2://node01:10000
输入root 和密码 123456
0: jdbc:hive2://node01:10000>
0: jdbc:hive2://node01:10000>
0: jdbc:hive2://node01:10000> show databases;
±---------------±-+
| database_name |
±---------------±-+
| default |
| myhive |
±---------------±-+
Hive传选项
hive -e ‘操作命令’
hive -e ‘show databases;’
hive -f 文件名(文件内是操作命令)
hive -f test.sql
数据库的基本操作
1、数据库的增删改查
增 : create database [ if not exists ] myhive ;
删 : drop database myhive ; (数据库内没有表可以删除,有表不能删除)
改 :数据库不允许修改
查 :show databases;
查看详细信息:
desc database myhive2;
desc database extended myhive2;
数据库的切换:
use myhive(数据库名);
hive的数据库、表、分区在HDFS的表现形式是文件夹
数据库的默认路径:/user/hive/warehouse
自定义hive数据库的路径:create database myhive2 location ‘/myhive2’;
数据表的基本操作(增删改查)
创建基本数据表(内部表):
create table tableName(字段名称 字段类型,字段名称 字段类型)
create table tableName(字段名称 字段类型,字段名称 字段类型)
ROW FORMAT DELIMITED IELDS TERMINATED BY char (char分隔符)
指定数据中字段与字段的分隔符 ‘\t’ 或 ‘,’ 或 ‘|’ 或其他
创建外部数据表:
create EXTERNAL table tableName(字段名称 字段类型,字段名称 字段类型)
建外部表需要指定数据的存储路径。通过LOCATION进行指定。
内部表与外部表的区别:
在删除内部表时:内部表删除将表的元数据和数据同时删除。
在删除外部表时:外部表的元数据被删除,数据本身不删除。
删除表
drop table tablename;
修改表
alter tablename ***
查询表
show tables;
desc tablename;
Hive的数据类型
基本数据类型
INT BIGINT FLOAT DOUBLE DEICIMAL STRING VARCHAR CHAR
BINARY TIMESTAMP DATE INTERVAL ARRAY
复杂数据类型
MAP STRUCT UNION
create table stu3 as select * from stu2; 复制数据复试表结构
create table stu4 like stu2; 不复制数据复试表结构。
加载数据
从linux中加载数据到hive
load data local inpath ‘数据路径’ into table 表名;
从hdfs中加载数据到hive,并覆盖
load data inpath ‘数据路径’ overwrite into table 表名;
外部表
create external table techer (t_id string,t_name string) row format delimited fields terminated by ‘\t’;
加载数据
load data local inpath ‘/export/servers/hivedatas/techer .csv’ into table techer ;
在hdfs查看表中的数据
hadoop fs -ls /user/hive/warehouse/myhive.db/techer
在hive中查询
select * from techer
删除数据表techer
drop table techer;
再次查看
hadoop fs -ls /user/hive/warehouse/myhive.db/techer(数据依然存在)
内部表
create table student(t_id string,t_name string) row format delimited fields terminated by ‘\t’;
加载数据
load data local inpath ‘/export/servers/hivedatas/student .csv’ into table student;
在hdfs查看表中的数据
hadoop fs -ls /user/hive/warehouse/myhive.db/student
在hive中查询
select * from student
删除数据表techer
drop table student;
再次查看
hadoop fs -ls /user/hive/warehouse/myhive.db/student(数据不存在)
分区表
企业常见的分区规则:按天进行分区(一天一个分区)
创建分区表的语句
create table score(s_id string,c_id string,s_score int) partitioned by (month string) row format delimited fieldsterminated by ‘\t’;
create table score2 (s_id string,c_id string,s_score int) partitioned by (year string,month string,day string) row formatdelimited fields terminated by ‘\t’;
数据加载
load data local inpath ‘/opt/hive/score.csv’ into table score partition (month=‘201806’);
load data local inpath ‘/opt/hive/score.csv’ into table score2 partition(year=‘2018’,month=‘06’,day=‘02’);
特别强调:
分区字段绝对不能出现在数据表以有的字段中。
作用:
将数据按区域划分开,查询时不用扫描无关的数据,加快查询速度。
分桶表
是在已有的表结构之上新添加了特殊的结构
开启hive的桶表功能
set hive.enforce.bucketing=true;
设置桶(reduce)的个数
set mapreduce.job.reduces=3;
建分桶表
create table course (c_id string,c_name string,t_id string) clustered by(c_id) into 3 buckets row format delimited fields terminated by ‘\t’;
创建基本表
create table course_common (c_id string,c_name string,t_id string) row format delimited fields terminated by ‘\t’;
基本表添加数据
load data local inpath ‘/export/servers/hivedatas/course.csv’ into table course_common;
在基本表中查询数据插入到分桶表
insert overwrite table course select * from course_common cluster by(c_id);
确认分桶内的数据
[root@node01 hive]# hadoop fs -cat /user/hive/warehouse/course/000000_0
03 英语 03
[root@node01 hive]# hadoop fs -cat /user/hive/warehouse/course/000001_0
01 语文 02
[root@node01 hive]# hadoop fs -cat /user/hive/warehouse/course/000002_0
02 数学 01
特别强调:
分桶字段必须是表中的字段。
分桶逻辑:
对分桶字段求哈希值,用哈希值与分桶的数量取余,余几,这个数据就放在那个桶内。
更多推荐
所有评论(0)