Apache Hive详解

一、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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值