业界动态
《Hive系列》Hive详细入门教程
2024-11-05 04:50

1.1 什么是Hive

  • Hive简介

Hive:由FaceBook开源用于解决海量结构化日志的数据统计工具

《Hive系列》Hive详细入门教程

Hive:基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL的查询功能。

  • Hive本质

将HSQL转化成MapReduce程序

1.2 Hive的优缺点

1.2.1 优点
1.2.2 缺点

1.3 Hive运行机制

1.4 Hive和数据库比较

1.4.1 数据更新
1.4.2 执行延迟
1.4.3 数据规模

2.1 安装JDK

2.2 安装Hadoop

2.3 安装MySQL

2.4 安装Hive

2.4.1 安装
2.4.2 hive远程模式
  • 上传mysql的jdbc驱动jar包到hive的lib下
  • 分配权限

mysql> grant all privileges on . to ‘root’@‘%’ identified by ‘123456’ with grant option;
mysql> flush privileges;
mysql> grant all privileges on . to ‘root’@‘hadoop’ identified by ‘123456’ with grant option;
mysql> flush privileges;

  • Navicat新建数据库hive

字符集:latin1

2.4.3 Thrift server

hive --service hiveserver2 &

beeline

!connect jdbc:hive2://hadoop:10000

2.5 Hive日志

3.1 基本数据类型

Hive数据类型Java数据类型长度TINYINTbyte1byteSMALLINTshort2byteINTint4byteBIGINTlong8byteBOOLEANboolean布尔类型FLOATfloat单精度浮点型DOUBLEdouble双精度浮点型STRINGstring字符系列TIMESTAMP时间类型BINART字节数组

Hive的String类型相当于数据库的Varchar类型,是一个不可变的字符串

3.2 集合数据类型

数据类型描述语法示例STRUCT和C语言中的struct类似,都可以通过“点”符号访问元素内容。例如:如果某个列的数据类型是struct{first string,last string},那么第一个元素可以通过字段.first来引用struct()
例如 structStreet:String,city:stringMAPMAP是一组键值对元组集合,使用数组表示法可以访问数据。例如:如果某个列的数据类型是MAP,其中的键值对是’first’->‘join’,‘last’->‘doe’,那么可以通过字段名’last’获取最后一个元素map()
例如 map<String,int>ARRAY数组是一组具有相同类型和名称的变量的集合。这些变量成为数据的元素,每个元素都有一个编号,编号从零开始。例如值为{‘join’,‘doe’},那么第二个元素可以通过数据名[1]进行引用Array()
例如 array
3.2.1 Array
3.2.2 Map
3.2.3 Struct

4.1 创建数据库

create database if not exists db_hive ;

默认存储路径是/usr/hive/warehouse/*.db

create database db_hive2 location ‘/db_hive2.db’;

创建一个数据库,指定数据库在HDFS上存储的位置

4.2 查询数据库

show databases;

show databases like ‘db_’;//过滤显示查询的数据库

desc database db_hive;//显示数据库信息

desc database extended db_hive;//显示数据库详细信息

use db_hive;//切换数据库

4.3 删除数据库

drop database if exists db_hive;//判断数据库存在并且删除

drop database db_hive cascade;//强制删除数据库

4.4 创建表

字段说明cteate table (if not exists)创建一个指定名字的表,如果存在则先删除external指定一个实际路径,创建其外部表,在删除内部表的时候元数据和数据会一起被删除,而删除外部表只会删除元数据不会删除数据commit为表和列添加注释partitioned by创建分区表clustered by创建分桶表sorted by不常用,对桶中的一个或多个列另外排序row format delimited[FIELDS TERMINATED BY char][COLLECTION ITEMS TERMINATED BY char][MAP KEYS TERMINATED BY char][LINES TERMINATED BY char]| SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value,property_name=property_value, …)]
Hive通过Serde确定表的具体列的数据。
SerDe是Serialize、Deserilize的简称,hive使用serde进行对象的序列话和反序列化stored adSEQUENCEFILE(二进制序列文件)、 TEXTFILE(文本)、 RCFILE(列式存储格式文件)location指定HDFS上的存储位置as后跟查询语句,根据查询结果创建表like允许用户复制现有的表结构,但是不复制数据
4.4.1 管理表
4.4.2 外部表
4.4.3 管理表和外部表的应用场景
4.4.4 管理表和外部表的互相转换

desc formatted student;//查询表类型

alter table student set tblproperties(‘EXTERNAL’ = ‘TRUE’);//修改内部表为外部表

alter table student set tblproperties(‘EXTERNAL’ = ‘false’);//修改外部表为内部表

​ (‘EXTERNAL’=‘TRUE’)和(‘EXTERNAL’=‘FALSE’)为固定写法, 区分大小写

4.5 修改表

4.5.1 重命名表

alter table table_name rename to new_table_name;

4.5.2 增加、修改、替换列信息
  • 更新列

alter table dept change column dept name desc String;//将dept的name改成String类型

  • 增加

alter table dept add columns(deptdesc string);

  • 替换

alter table dept replace columns(deptno string,dname string,loc string);

  • ADD是代表新增一字段,字段位置在所以列后面(partition 列前)
  • replace则是表示替换表中所有的字段

5.1 数据导入

load data [local] inpath ‘date path’ [overwrite] into table student [partition (partcol1=val1.)]

指令含义load data表示加载数据local表示从本地加载数据到hive,否则从HDFS加载数据到hiveinpath表示加载数据的路径overwrite表示覆盖表中已有数据,否则表示追加into table表示加载到哪张表student表示具体的表partition表示上传到指定分区

hdfs dfs -put /opt/data/student.txt /user/hive;

  • 创建表

create table student(id string, name string) row format

delimited fields terminated by ‘ ’;

  • 导入数据

load data inpath ‘/user/hive/student.txt’ overwrite into table student;

5.2 通过查询语句向表中插入数据

  • 基本插入数据

insert into table student values(1,‘zxy’),(2,‘zhou’)

  • 基本模式插入

insert overwrite table student select id,name from students where month = ‘202107’

insert into :以追加的方式插入到表或分区,原有数据不会删除

insert overwrite:会覆盖表中已存在的数据

  • 多分区插入模式

from student

insert overwrite table student partition(month = ‘202107’)

select id,name where month = ‘202108’

insert overwrite table studdent partition(month = ‘202106’)

select id,name where month = ‘202109’

5.3 数据导出

5.3.1 Insert导出
  • 将查询结果导出到本地

insert overwrite local directory ‘/opt/apps/student’ select * from student;

  • 将查询结果格式化导出到本地

insert overwrite local directory ‘/opt/apps/student’

  • 将查询结果导出到HDFS

insert overwrite directory ‘/user/student’

5.3.2 Hadoop命令导出到本地
  • hdfs命令导出

hdfs dfs -get /user/hive/student.txt /opt/apps/student.txt

  • hive shell 命令导出

hive -e ‘select * from student;’ > /opt/apps/student/student.txt

  • export导出到hdfs上

export table student to ‘/user/hive/student’

export 和 import 主要用于两个 Hadoop 平台集群之间 Hive 表迁移。

5.3.3 sqoop导出
5.3.4 清楚表中数据(Truncate)

truncate table student;

注意: Truncate 只能删除管理表, 不能删除外部表中数据

6.1 基本查询

6.1.1 tips

SQL语言大小写不敏感

SQL可以写在一行或者多行

关键字不能被缩写也不能分行

各子句一般要分行写

使用缩进提高可读性

6.1.2 别名

重命名一个列

便于计算

紧跟列名,也可以在列名和别名之间加入关键字‘AS’

6.1.3 算术运算符
运算符描述A+BA和B相加A-BA减去BA*BA和B相乘A/BA除以BA%BA对B取余A&BA和B按位取与A|BA和B按位取或A^BA和B按位取异或~AA按位取反
6.1.4 常用函数
函数案例countselect count(*) cnt from emp;maxselect max(age) max_age from emp;minselect min(age) min_age from emp;sumselect sum(age) sum_age from emp;avgselect avg(age) avg_age from emp;
6.1.5 Limit

Limit子句用于限制返回的行数

select * from emp limit 5;

6.1.6 where语句

使用where语句,将不满足条件的过滤掉

where子句紧随from子句

select * from emp where sal in (1500,5000);

6.1.7 Like和RLike
  • like

%代表零个或者多个字符

_表示一个字符

  • Rlike

RLIKE可以使用正则表达式这个强大的功能

select * from emp where name RLIKE ‘[A]’;

6.2 分组

6.2.1 GROUP BY语句

GROUP BY语句经常和聚合函数一起使用,按照一个或者多个队列结果进行分组,然后对每个组执行聚合操作

6.2.2 Having语句
  • having和where的不同点

where后面不能些分组函数,而having后面可以使用分组函数

having只用于group by分组统计语句

6.3 Join语句

  1. 尽量避免使用子查询,但是子查询不可避免
  2. 尽量避免过多的join查询,但是join查询不可避免
  3. 尽量不要使用in或者not in的语法
  4. 一定要使用小表驱动大表,因为hive在做查询的时候,首先缓存一部分数据(查看左边的表)。说白了就是数据量小的表尽量先查。
  • 表别名的好处

使用别名可以简化查询

使用别名可以提高执行效率

交叉查询:access join: 产生笛卡尔积的查询

:左半连接

6.3.1 数据
6.3.2 内连接(inner join)
A_idA_nameB_idB_name2b2b4d4d
6.3.3 左外连接(left join)

A left join B

A_idA_nameB_idB_name1anullnull2b2b3cnullnull4d4d
6.3.4 右外连接(right join)

A right join B

A_idA_nameB_idB_name2b2b4d4dnullnull5e
6.3.5 全连接(full join)
A_idA_nameB_idB_name1anullnull2b2b3cnullnull4d4dnullnull5e
6.3.6 左半连接

B left semi join A

on A.id=B.id

B.idB.name2b4d
6.3.7 多表连接

连接n个表,至少需要n-1个条件

6.3.8 笛卡尔积

笛卡尔积会在下面条件下产生

  • 省略连接条件
  • 连接条件无效
  • 所有表中的所有行互相连接
6.3.9 in

select * from A where A.id in (select B.id from B)

6.3.10 子查询

总体来说,hive的子查询和sql的子查询是一样的。子查询只能出现在from之后或者where之后

子查询对别名的识别特别严格,任何的可以取别名的地方,定义一个别名

6.4 排序

6.4.1 全局排序(Order by)

全局排序,只有一个Reducer

  • 使用OEDER BY子句排序

ASC(ascend):升序(默认

DESC(descend):降序

6.4.2 每个Reduce内部排序(Sort by

桶内有序,不保证全局有序

sort by : 对于大规模的数据集order by的效率非常低。很多情况下,并不需要全局排序,此时可以使用sort by

sort by为每个reduce产生一个排序文件,每个Reduce内部进行排序,对全局结果集来说不是排序

  • 设置reduce个数

set mapreduce.job.reduces=3;

  • 查看设置reduce个数

set mapreduce.job.reduces;

6.4.3 分区(Distribute by)
  • tips

distribute by的分区规则是根据分区字段的hash码与reduce的个数进行模除后,余数相同的分到一个区。

Hive要求distribute by语句要写在sort by语句之前

6.4.4 Cluster By

当distribute by和sort by字段相同时,可以使用cluster by方式。

cluster by除了具有distribute by功能外,还具有sort by功能,但是排序只能是升序排序,不能指定排序规则为ASC或者DESC

select * from emp cluster by deptno;

select * from emp distribute by deptno sort by deptno;

7.1 分区表

7.2 分区表

7.3 把数据直接上传到分区目录上,让分区表和数据产生关联的三种方式

7.3.1 上传数据后修复

查询不到

  • 修复数据

msck repair table dept_partition;

  • 再次查询数据
7.3.2 上传数据后添加分区
  • 添加分区

alter table ddept_partition add partition(day=‘20210725’,hour=‘8’)

7.3.3 创建文件夹后load数据到分区

load data local inpath ‘/opt/apps/dept_20210725.log’ into table dept_partiton partition(day=‘20210725’,hour=‘8’)

7.4 动态分区调整

7.4.1 开启动态分区
  1. 静态分区:加载数据的时候指定分区的值
  2. 动态分区:数据未知,根据分区的值创建分区
  3. 静态+动态

7.5 分桶

桶是比分区更细粒度的划分。当我们对表中的数据进行join的时候势必回产生笛卡尔积。桶就是可以帮助我们减少笛卡尔积。

分桶表的建立不可以直接导入数据,需要建立中间表

  • 设置reduce个数,即为分桶数量

7.5.1 准备数据
7.5.2 建立中间表
7.5.3 分桶查询
7.5.4 建立分桶表
7.5.5 导入分桶表
7.5.6 采样查询

7.6 分区分桶表

需要开启非严格模式,若配置文件没有修改,可使用命令行操作

set hive.exec.dynamic.partition.mode=nonstrict;

7.6.1 中间表
7.6.2 创建分桶分区表
7.6.3 向表中导入数据

8.1 窗口函数定义

​ 窗口函数又叫做开创函数,他是一种分析的函数,专门可以解决报表类型的需求分析。他专门用于计算基于组的某种聚合。对于每个组返回返回是多行,也就是聚合函数的分组只有显示一行

​ 开窗函数指定了分析函数的窗口大小,窗口的大小会根据行的变化而变化

8.2 Over函数

8.2.1 数据
8.2.2 建表

8.3 排名函数

row_number():不存在并列成绩

​ eg:1,2,3,4

rank():有并列成绩,可以不按顺序排名

​ eg:1,2,2,4

dense_rank():有并列,名次相同,有顺序

​ eg:1,2,2,3

8.3.1 建表
8.3.2 案例

8.4 分区(partition by,distribute by)

8.5 排序(order by,sort by)

8.6 Window子句

8.6.1 举例

8.7 ntile函数:将结果分片编号

8.8 lead和lag

lag:返回当前数据行的上一行

lead:返回当前行数据行得下一行

8.9 first_value和last_value

9.1 数值函数

函数说明举例round四舍五入到声明的最低为round(12.3456,2) => 12.35floor获取一个不大于X的最大的整数floor(3.41) => 3ceil获取一个不小于X的最小的整数ceil(3.41) => 4rand随机数(0~1)rand() => 0.4215462365

9.2 数学函数

函数说明举例abs求绝对值abs(-1) => 1powa的b次幂pow(2,3) => 8.0

9.3 条件判断

9.3.1 if(expr1,expr2,expr3)

如果expr1为true,返回expr2,否则返回expr3

9.3.2 case…when

类似于if…else

9.4 日期函数

函数说明举例current_date()获取当天的日期(yyyy-MM-dd)select current_date();current_timestamp()获取当天的时间戳(yyyy-MM-dd HH:mm:ss.SSS)select current_timestamp();add_month(start_date,num_month)返回start_date后${num_month}月的日期date_add(start_date,num_days)返回start_date后${num_days}天的日期date_sub(start_date,num_days)返回start_date之前${num_days}天的日期next_day(start_date,day_of_week)返回start_date日期之后最接近day_of_week的日期select next_day(current_date(),‘MON’)dayofmonth(date)返回date对应的是这个月的第几天minute/hour/day/month/year返回当前时间戳对应的分组小时天数月份年select day(current_timestamp());date_format(string/date/timestamp,format)格式化时间select date_format(current_date(),‘yyyy’)datediff(date1,date2)判断两个日期相差的天数select datediss(‘2021-08-02’,‘2021-08-05’);to_unix_timestamp(date)获取date对应unix的时间select to_unix_timestamp(current_date());from_unixtime(unix_time,format)将unix_time转换为format的时间select from_unixtime(16209211600,‘yyyy_MM-dd’)to_date(datetime)返回datetime中的dateselect to_date(current_timestamp());

9.5 字符串相关函数

函数说明例如length求字符串长度length(“zxy”) => 3instr(str,substr)查出substr在str中的索引位置instr(‘www.baidu.com’,‘b’) => 5substr(str,begin[len],end(len))查出指定索引区间的字符串substr(‘www.baidu.com’,4) => .baidu.comsubstring_index(str,delimi,count)hive-1.2.1没有这个函数substring_index(‘www.baidu.com’,‘.’,2)concat(str1,str2,…)拼接字符串concat(‘z’,‘x’,‘y’) => zxyconcat_ws(separator,str1,str2)以指定符号连接字符串concat_ws(‘.’,‘www’,‘baidu’,‘com’) => www.baidu.com

9.6 统计函数

函数说明举例sum求和avg求平均值count求个数max求最大值min求最小值index(arr,n)求索引位置n处的元素index(array(1,2,3),0)=>1split(str,regex)将str按照regex切割成数组split(‘www.baidu.com’,‘\.’) => [‘www’,‘badu’.‘com’]cast(type1 as type2)将数据类型type1转换为type2cast(12 as string)

9.7 案例小结

9.7.1 单词统计
9.7.2 SQL

10.1 UDF

User Define Function:UDF

10.2 导入依赖

10.3 自定义生日转年龄

  • 打包hive.jar
  • 上传至hdfs

hdfs dfs -put /data/jars/hive.jar /common/jars/

  • 新建函数
  • 依赖
  • 代码

12.1 row format delimited

12.2 fields terminated by ‘,’

12.3 SerDe类型

12.3.1 常用的SerDe
12.3.2 CSV测试
  • 默认方式存储(逗号)
  • 修改存储方式(空格)
12.3.3 Json测试
  • 导入第三方json解析工具

hive (zxy) > add jar /data/jars/json-serde-1.3.9-SNAPSHOT-jar-with-dependencies.jar;

  • json解析
12.3.4 RegEx
  • 数据
  • 处理思路

12.4 保存类型

12.4.1 不同存储类型

不能直接使用load的需要使用查询插入的方法

12.5 Hive数据导出

13.1 定义

13.2 索引测试

13.3 视图测试

14.1 hive -e

执行sql语句

14.2 hive -f

直接执行hive的脚本文件

    以上就是本篇文章【《Hive系列》Hive详细入门教程】的全部内容了,欢迎阅览 ! 文章地址:http://www78564.xrbh.cn/news/26691.html 
     文章      相关文章      动态      同类文章      热门文章      栏目首页      网站地图      返回首页 迅博思语移动站 http://www78564.xrbh.cn/mobile/ , 查看更多   
最新文章
中牟seo快速排名 中牟SEO技巧:快速排名提升攻略
中牟SEO快速排名:实战策略与深度解析在当今互联网竞争激烈的时代,搜索引擎优化(SEO)已成为企业网站提升曝光度、获取流量和转
今天有好东西,大折扣!
仰仰铺子·好物盘点这一期好物盘点,千万别错过!都是好宝贝,超低价,就连我们好久没有福利活动的丝蓓缇黑姜分解酵母也弄到了特
SEO推广排名的奥秘,全面解析实现路径与战略意义
SEO推广排名是指通过搜索引擎优化技术提高网站在搜索引擎结果页面(SERP)中的排名。实现SEO排名需要优化网站内容、结构、技术等
【图】领克05欢迎莅临赏鉴 价格直降1.1万 详询:4009728340
购好车来领福新年享9重好礼【试驾礼】进店试乘试驾均享受精美礼品一份【大客户】指定企业员工购车享3000元补贴。【置换礼】至高
快步剪辑师(快剪辑教学)
摘要:快步剪辑师,快剪辑教学课程,场课为您整理出关于快步剪辑师的相关在线教程知识,欢迎访问了解快步剪辑师(快剪辑教学)的
推动手机能效标准化:从用户呼声看行业未来
近年来,智能设备的普及让我们越来越依赖手机,而手机的能效问题逐渐引起了用户的关注。近期,有用户提出建议,希望将手机能效列
GPT-4 接入 Office 全家桶:Word 一键变成 PPT,打工人的春天来了!
作者 | 屠敏出品 | CSDN(ID:CSDNnews)这一周的科技圈异常地热闹,且多数都是大模型给的:周二
双十二荣耀手机别乱买!这三款物美价廉,性价比几乎“零差评”
每年到了双十二,买手机这件事就像一场“技术与钱包的拔河赛”。想选性价比高的,又怕踩雷;想要配置好的,又担心被钱包发出“哀
分析Android 搜狗输入法在微信和QQ中发送图片和表情
好记性不如烂笔头。生活中多做笔记,不仅可以方便自己,还可以方便他人。有没有发现,有时候表情或图片的交流更能让气氛更愉悦。
企业SEO用什么程序:提升搜索引擎排名的必备工具与策略
在当今数字化时代,企业的在线存在变得日益重要。为了在激烈的市场竞争中取得优势,企业必须充分利用搜索引擎优化(SEO)技术。