Hive简介

Hive基本概念

​ 是一个基于hadoop的数据仓库工具,可以将结构化数据映射成一张数据表,并提供类SQL的查询功能。

Hive的意义是什么

​ 背景:hadoop是个好东西,但是学习难度大,成本高,坡度陡。

​ 意义(目的):降低程序员使用hadoop的难度。降低学习成本。

Hive可以对数据进行存储与计算

​ 存储使用HDFS存储

​ 计算使用MapReduce进行计算。

Hive的特性

​ 1、扩展性 : Hive的扩展性与集群的扩展性相同

​ 2、延展性:Hive支持用户自定义函数,编写符合自己业务需求的函数。

​ 3、容错性:节点出现问题(宕机/断电)SQL仍可完成执行。

Hive缺点

​ 每次的执行开销较大,任务运行时间较长,延时较高。

Hive的内部组成架构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uFnCeRc9-1574339077403)(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-oTpfahRV-1574339077404)(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

特别强调:

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

分桶逻辑:

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

分桶的作用和好处

​ 1、对于join的需求,能够起到优化加速的作用。(前提是,join字段设置为分桶字段)

​ 2、用于数据取样(获取/提取数据样本)

​ 将数据编号作为分桶字段。这样每个桶内各种“级别”的数据都有。

Hive的自定义函数

​ 函数查看

​ show functions;

​ show function 函数名 ;

​ desc function extended upper;


​ UDF UDAF UDTF

​ 一进一出 多进一出 一进多出

​ UDF

​ 1、创建一个class 继承UDF

​ 2 编写evaluate函数,在这里编写业务需求需要的代码

​ 3 打成jar包,并上传

​ 4 将jar包添加到hive

​ 在hive shell 内 add jar 路径+jar包

​ 5 创建临时函数(永久的函数将temporary 删掉)

​ create temporary function 新的函数的名称 as 业务代码所在的包名-类名;

​ 6 调用 验证;

使用纯 java 代码创建临时函数

  1. 使用纯java代码编写业务逻辑, 并打包上传
  2. 将jar 包添加到hive
    在 hive shell 内 add jar 路径 + jar 包
  3. 调用
   select reflect('第一个参数','第二个参数','第三个参数');

第一个参数: java代码包名加类名
第二个参数: java代码方法名
第三个参数: 需要传递的参数

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值