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

特别强调:

分桶字段必须是表中的字段。

分桶逻辑:

对分桶字段求哈希值,用哈希值与分桶的数量取余,余几,这个数据就放在那个桶内。

Logo

大数据从业者之家,一起探索大数据的无限可能!

更多推荐