文章目录
- 一、Apache Hive概述
- 二、Apache Hive架构、组件
- 三、Apache Hive元数据
- 四、Hive SQL语言
- 五、hive案例:将结构化文件映射到hive中
- 六、Apache Hive DML语句与函数使用
一、Apache Hive概述
- Apache Hive是一款建立在Hadoop之上的开源数据仓库系统,可以将存储在Hadoop文件中的结构化、半结构化数据文件映射为一张数据库表,基于表提供了一种类似SQL的查询模型,称为Hive查询语言(HQL),用于访问和
分析存储在Hadoop文件中的大型数据集。 - Hive核心是将HQL转换为MapReduce程序,然后将程序提交到Hadoop集群执行。
- Hive由Facebook实现并开源。
- Hive利用HDFS存储数据,利用MapReduce查询分析数据。
- Hive的最大的魅力在于用户专注于编写HQL,Hive帮您转换成为MapReduce程序完成对数据的分析。
二、Apache Hive架构、组件
1.Hive架构图
2.Hive组件
(1)用户接口
包括 CLI、JDBC/ODBC、WebGUI。其中,CLI(command line interface)为shell命令行;Hive中的Thrift服务器允许
外部客户端通过网络与Hive进行交互,类似于JDBC或ODBC协议。WebGUI是通过浏览器访问Hive。
(2)元数据存储
通常是存储在关系数据库如 mysql/derby中。Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
(3)Driver驱动程序
包括语法解析器、计划编译器、优化器、执行器
(4)执行引擎
Hive本身并不直接处理数据文件。而是通过执行引擎处理。当下Hive支持MapReduce、Tez、Spark3种执行引擎。
(5)启动命令
hive --service metastore
hive --service hiveserver2
//杀掉端口占用了10000的yunDetectService服务,占用端口
三、Apache Hive元数据
1.元数据
元数据(Metadata),又称中介数据、中继数据,为描述数据的数据(data about data),主要是描述数据属
性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。
2.Hive Metadata
- Hive Metadata即Hive的元数据。
- 包含用Hive创建的database、table、表的位置、类型、属性,字段顺序类型等元信息。
- 元数据存储在关系型数据库中。如hive内置的Derby、或者第三方如MySQL等。
3.Hive Metastore
- Metastore即元数据服务。Metastore服务的作用是管理metadata元数据,对外暴露服务地址,让各种客户端通过连接metastore服务,由metastore再去连接MySQL数据库来存取元数据。
- 有了metastore服务,就可以有多个客户端同时连接,而且这些客户端不需要知道MySQL数据库的用户名和密码,只需要连接metastore 服务即可。某种程度上也保证了hive元数据的安全。
- metastore远程模式
四、Hive SQL语言
1.Hive SQL之数据库与建库
- 在Hive中,默认的数据库叫做default,存储数据位置位于HDFS的/user/hive/warehouse下。
- 用户自己创建的数据库存储位置是/user/hive/warehouse/database_name.db下。
(1)create database
用于创建新的数据库。
- COMMENT:数据库的注释说明语句。
- LOCATION:指定数据库在HDFS存储位置,默认/user/hive/warehouse/dbname.db。
- WITH DBPROPERTIES:用于指定一些数据库的属性配置。
举例:创建数据库study_test
create database if not exists study_test
comment "这是一个学习的测试数据库"
with dbproperties ('createBy' = 'root');
(2)use database
- 选择特定的数据库。
- 切换当前会话使用哪一个数据库进行操作。
use study_test;
(3)drop database
- 删除数据库
- 默认行为是RESTRICT,这意味着仅在数据库为空时才删除它。
- 要删除带有表的数据库(不为空的数据库),我们可以使用CASCADE。
drop database study_test;
五、hive案例:将结构化文件映射到hive中
1.结构化txt文件
95001 李勇 男 20 CS
95002 刘晨 女 19 IS
95003 王敏 女 22 MA
95004 张立 男 19 IS
2.hive中建表
create table study_test.t_student
(
stu_no int comment '学号',
name string comment '姓名',
gender string comment '性别',
age int comment '年龄',
remark string comment '备注'
) row format delimited
fields terminated by "\t"; //表示以制表符作为分割数据列的标志
3.上传文件
将文件上传到你新建表的目录下面
4.查询数据
可以看到已经将数据映射到hive的数据库中了
SELECT *
FROM study_test.t_student;
六、Apache Hive DML语句与函数使用
1.Hive SQL DML语法之加载数据
- 在Hive中建表成功之后,就会在HDFS上创建一个与之对应的文件夹,且文件夹名字就是表名;
- 文件夹父路径是由参数hive.metastore.warehouse.dir控制,默认值是/user/hive/warehouse;
- Hive官方推荐使用Load命令将数据加载到表中
新建student_local.txt填充数据
95001,李勇,男,20,CS
95002,刘晨,女,19,IS
95003,王敏,女,22,MA
95004,张立,男,19,IS
95005,刘刚,男,18,MA
95006,孙庆,男,23,CS
95007,易思玲,女,19,MA
95008,李娜,女,18,CS
95009,梦圆圆,女,18,MA
95010,孔小涛,男,19,CS
95011,包小柏,男,18,MA
95012,孙花,女,20,CS
95013,冯伟,男,21,CS
95014,王小丽,女,19,CS
95015,王君,男,18,MA
95016,钱国,男,21,MA
95017,王风娟,女,18,IS
95018,王一,女,19,IS
95019,邢小丽,女,19,IS
95020,赵钱,男,21,IS
95021,周二,男,17,MA
95022,郑明,男,20,MA
新建表
--step1:建表
--建表student_local 用于演示从本地加载数据
create table student_local
(
num int,
name string,
sex string,
age int,
dept string
) row format delimited fields terminated by ',';
load数据
LOAD DATA LOCAL INPATH 'D:/hadoop/student_local.txt' INTO TABLE student_local;
2.Hive SQL-DML-Insert插入数据
最常用的配合是把查询返回的结果插入到另一张表中。
insert+select表示:将后面查询返回的结果作为内容插入到指定表中。
- 需要保证查询结果列的数目和需要插入数据表格的列数目一致。
- 如果查询出来的数据类型和插入表格对应的列数据类型不一致,将会进行转换,但是不能保证转换一定成功,转换失败的数据将会为NULL。
--创建一张目标表 只有两个字段
create table student_from_insert
(
sno int,
sname string
);
--使用insert+select插入数据到新表中
insert into table student_from_insert select num, name from student_local;
select * from student_from_insert;
3.Hive SQL DML语法之查询数据
distinct去重
--返回所有匹配的行 去除重复的结果
select distinct state from t_usa_covid19;
其他的用法都和mysql很像,大致都是一样的方式。
4.Hive 常用函数入门
Hive的函数分为两大类:内置函数(Built-in Functions)、用户定义函数UDF(User-Defined Functions):
- 内置函数可分为:数值类型函数、日期类型函数、字符串类型函数、集合函数、条件函数等;
- 用户定义函数根据输入输出的行数可分为3类:UDF、UDAF、UDTF。
- 根据函数输入输出的行数:
UDF(User-Defined-Function)普通函数,一进一出
UDAF(User-Defined Aggregation Function)聚合函数,多进一出
UDTF(User-Defined Table-Generating Functions)表生成函数,一进多出
- 根据函数输入输出的行数:
5.Hive 常用的内置函数
函数库https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF
(1)String Functions 字符串函数
- 字符串长度函数:length
- 字符串反转函数:reverse
- 字符串连接函数:concat
- 带分隔符字符串连接函数:concat_ws
- 字符串截取函数:substr,substring
------------String Functions 字符串函数------------
select length("dsaf");
select reverse("olklf");
select concat("angela","baby");
--带分隔符字符串连接函数:concat_ws(separator, [string | array(string)]+)
select concat_ws('.', 'www', array('gsdffsd', 'cn'));
--字符串截取函数:substr(str, pos[, len]) 或者 substring(str, pos[, len])
select substr("angelababy",-2); --pos是从1开始的索引,如果为负数则倒着数
select substr("angelababy",2,2);
--分割字符串函数: split(str, regex)
select split('apache hive', ' ');
(2)Date Functions 日期函数
----------- Date Functions 日期函数 -----------------
--获取当前日期: current_date
select current_date();
--获取当前UNIX时间戳函数: unix_timestamp
select unix_timestamp();
--日期转UNIX时间戳函数: unix_timestamp
select unix_timestamp("2011-12-07 13:01:03");
--指定格式日期转UNIX时间戳函数: unix_timestamp
select unix_timestamp('20111207 13:01:03','yyyyMMdd HH:mm:ss');
--UNIX时间戳转日期函数: from_unixtime
select from_unixtime(1618238391);
select from_unixtime(0, 'yyyy-MM-dd HH:mm:ss');
--日期比较函数: datediff 日期格式要求'yyyy-MM-dd HH:mm:ss' or 'yyyy-MM-dd'
select datediff('2012-12-08','2012-05-09');
--日期增加函数: date_add
select date_add('2012-02-28',10);
--日期减少函数: date_sub
select date_sub('2012-01-1',10);
(3)Mathematical Functions 数学函数
----Mathematical Functions 数学函数-------------
--取整函数: round 返回double类型的整数值部分 (遵循四舍五入)
select round(3.1415926);
--指定精度取整函数: round(double a, int d) 返回指定精度d的double类型
select round(3.1415926,4);
--取随机数函数: rand 每次执行都不一样 返回一个0到1范围内的随机数
select rand();
--指定种子取随机数函数: rand(int seed) 得到一个稳定的随机数序列
select rand(3);
(4)Conditional Functions 条件函数
--if条件判断: if(boolean testCondition, T valueTrue, T valueFalseOrNull)
select if(1=2,100,200);
select if(sex ='男','M','W') from student limit 3;
--空值转换函数: nvl(T value, T default_value)
select nvl("allen","itcast");
select nvl(null,"itcast");
--条件转换函数: CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END
select case 100 when 50 then 'tom' when 100 then 'mary' else 'tim' end;
select case sex when '男' then 'male' else 'female' end from student limit 3;
标签:函数,--,Hive,详解,hive,Apache,数据,select
From: https://blog.csdn.net/weixin_45404884/article/details/140594111