赞
踩
Hive:由 Facebook 开源用于解决海量结构化日志的数据统计。
Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类 SQL 查询功能。
本质是:将 HQL 转化成 MapReduce 程序
因为数据仓库需要更加便捷的方式(SQL)对大量数据进行统计,
因此就将SQL语言所常用操作(Select,Where,Group等)用MapReduce写成模板,并将MapReduce模板封装在Hive中,以备客户端使用。
客户端的用户根据业务需求编写相应的SQL语句,而此时Hive会通过用户输入的SQL语句匹配出相应MR模板,并运行MapRduce程序,最后生成相应的分析结果。
1)Hive 处理的数据存储在HDFS
2)执行程序运行在Yarn上
Hive是完全基于Hadoop(HDFS,MR,YARN)之上。
1)操作接口采用类SQL语法,提供快速开发的能力。
2)避免了去写MR程序。
3)Hive的执行延迟比较高,因此使用常用于数据分析,对实时性不高的场合。
4)Hive优势在处理大数据,对于处理小数据没有优势,因为 Hive 的执行延迟比较高。
5)Hive 支持用户自定义函数,如UDF,UDTF函数,用户可以根据自己的需求来实现自己的函数。
1. Hive 的 HQL 表达能力有限
2. Hive 的效率比较低
用户接口:Client
可以通过三种方式来访问Hive
1)CLI(Hive Shell)
2)JDBC(java 访问 hive)
3)WEBUI(浏览器访问hive)
元数据:Metastore
元数据包括:表名、表所属的数据库(默认是 default)、表的拥有者、列/ 分区字段、表的类型(是否是外部表)、表的数据所在目录等;
默认存储在自带的 derby 数据库中,推荐使用 MySQL 存储 Metastore
不推荐Derby数据库,是因为Derby数据库无法多用户访问。
Hadoop
使用HDFS进行存储,使用MapReduce进行计算。
驱动器:Driver
1)解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方库完成,比如 antlr;对 AST 进行语法分析,比如表是否存在、字段是否存在、 SQL 语义是否有误。
2)编译器(Physical Plan):将AST编译生成逻辑执行计划。
3)优化器(Query Optimizer):将逻辑执行计划进行优化。
4)执行器(Execution):把逻辑执行计划转换成可以运行的物理计划,对于Hive来说,就是MR/Spark。
Hive 通过给用户提供了一系列交互接口,接收到用户的指令(SQL),使用自己的Driver,结合元数据(Metastore),将这些指令翻译成MapReduce,提交到Hadoop中执行,最后,将执行返回的结果输出到用户交互接口。
元数据(Metastore):即查询数据映射到 HDFS 中存放文件的路径(path)以及表的相关信息。
由于 Hive 是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。 因此, Hive
由于Hive是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。
因此,Hive中不建议对数据的改写,所有的数据都是在加载的时候确定好的。
而数据库中的数据通常是需要经常进行修改的,因此可以使用INSERT INTO … VALUES添加数据,使用 UPDATE … SET 修改数据。
Hive在加载数据的过程不会对数据进行任何处理,因此也没有对数据中的某些Key建立索引。
因此Hive要访问数据中满足条件的特定值,就需要暴力扫描整个数据,访问延迟较高。
但由于MapReduce的引入,Hive可以并行访问数据,因此即使没有索引,对于大数据量的访问,Hive依然能够体现出优势。
$bin/hive --service metastore
此时开启的是前台服务
通过 JDBC(MySQL驱动) 连接 MySQL
$bin/hive
$bin/hive --service metastore
$bin/hive --service hiveserver2
$bin/beeline -u jdbc:hive2://hadoop102:10000 -n root
Hive 数据类型 | Java 数据类型 | 长度 | 例子 |
---|---|---|---|
TINYINT | byte | 1byte 有符号整数 | 20 |
SMALINT | short | 2byte 有符号整数 | 20 |
INT | int | 4byte 有符号整数 | 20 |
BIGINT | long | 8byte 有符号整数 | 20 |
BOOLEAN | boolean | 布尔类型, true 或者 false | TRUE FALSE |
FLOAT | float | 单精度浮点数 | 3.14159 |
DOUBLE | double | 双精度浮点数 | 3.14159 |
STRING | string | 字符系列。可以指定字符集。 可以使用单引号或者双引号。 | ‘now is the time’ “for all good men” |
其中Hive中的String类型相当于数据库的varchar类型,该类型是一个可变的字符串,不过不能声明其中最多有多少字符,理论上可以存储2GB的字符数。
Hive 有三种复杂数据类型 ARRAY、 MAP 和 STRUCT。 ARRAY 和 MAP 与 Java 中的 Array 和 Map 类似,而 STRUCT 与 C 语言中的 Struct 类似,它封装了一个命名字段集合,复杂数据类型允许任意层次的嵌套。
1) 假设某表有如下一行,我们用 JSON 格式来表示其数据结构。在 Hive 下访问的格式为
{
"name": "songsong",
"friends": ["bingbing" , "lili"] , //列表 Array,
"children": { //键值 Map,
"xiao song": 18 ,
"xiaoxiao song": 19
},
"address":{ //结构 Struct,
"street": "hui long guan" ,
"city": "beijing"
}
}
2) 基于上述数据结构,我们在 Hive 里创建对应的表,并导入数据。
创建本地测试文件 test.txt
songsong,bingbing_lili,xiao song:18_xiaoxiao song:19,hui long guan_beijing
yangyang,caicai_susu,xiao yang:18_xiaoxiao yang:19,chao
yang_beijing
注意其中的分隔符 Map,Struct**,Array 中元素之间都是用 _ 分开**。
3) Hive 上创建测试表 test
create table test02{ name string, friends array<string>, children map<string, int>, address struct<street:string, city:string> } //列分隔符 row format delimited fields terminated by ',' //Map,struct,array的元素之间分隔符 collection items terminated by '_' //map中kv的分隔符 map keys terminated by ':' //行分隔符 lines terminated by '\n';
4)导入文本数据集到测试表
hive(default)> load data local inpath "/opt/module/datas/test.txt";
插入数据也可以通过 test.txt 上传至 HDFS 上所插入表的路径
hive(default)> hadoop fs -put test.txt /user/hive/warehouse/test02
6)最后使用 hive 查询 test02 表中的数据
>select * from test02;
数组:使用数组下标访问
Map:使用[]访问
Struct:使用 address.street 访问
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fTqJ7faA-1638446907137)(C:\Users\Juniors Lee\Pictures\Hive\微信截图_20211112175012.png)]
String类型(例如"23.4")可以隐式转换为Double
1)创建一个数据库, 数据库在 HDFS 上的默认存储路径是/user/hive/warehouse/*.db
hive (default)> create database db_hive;
2)增加 if not exists 判断,以防差错。(标准写法)
hive (default)> create database if not exists db_hive;
3)创建一个数据库可以指定该数据库在HDFS上的存放路径。
hive(default)> create database db_hive2 location '/db_hive.db'
show databases;
desc database hive;
use hive;
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_comment] //创建分区表 [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] //创建分桶表 [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] //行数据的格式 [ROW FORMAT row_format DELIMITED FIELDS TERMINATED BY '\t'] //指定存储文件类型: //如果是数据是纯文本:TEXTFILE,如果是数据需要压缩则使用:SEQUENCEFILE [STORED AS file_format] //指定表在HDFS上的存储位置 [LOCATION hdfs_path]
默认创建的表都是所谓的管理表,有时也被称为内部表。因为这种表, Hive 会(或多或少地) 控制着数据的生命周期。
Hive 默认情况下会将这些表的数据存储在由配置项hive.metastore.warehouse.dir(例如,/user/hive/warehouse)所定义的目录的子目录下。
当我们删除一个管理表时,Hive也会删除这个表中数据。管理表不适合和其他工具共享数据。
查看表类型
desc formatted moive;
因为表是外部表,所以 Hive 并非认为其完全拥有这份数据。
删除该表并不会删除掉这份数据,不过描述表的元数据信息会被删除掉。
管理表和外部表的使用场景每天将收集到的网站日志定期流入 HDFS 文本文件。
在外部表(原始日志表)的基础上做大量的统计分析,用到的中间表、 结果表使用内部表存储,数据通过SELECT+INSERT 进入内部表。
创建外部表
create external table if not exists dept(
deptno int,
dname string,
loc int
)
row format delimited fields terminated by '\t';
转外部表
alter table student set tblproperties('EXTERNAL'='TRUE');
转内部表
alter table student set tblproperties('EXTERNAL'='FALSE');
分区表对应的就是对应一个HDFS文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件。Hive中的分区就是分目录,把一个大的数据集根据业务(比如按照时间)分割成小的数据集。在查询时通过WHERE子句中的表达式选择查询所需要的指定的分区,这样查询效率会提高很多。(谓词下推)
hive> create table dept_partition(deptno int, dname string, loc string)
partitioned by (month string)
row format delimited fields terminated by '\t';
hive> load data local inpath '/opt/module/hive/data/dept.txt' into table dept_partition partition(month='2021-11');
MySQL存放着分区的元数据,HDFS存放着真正的数据。
请添加图片描述
hive (default)> alter table dept_partition add partition(month="20211201") partition(month="20211202")
hive (default)> alter table dept_partition drop partition(month="20211201");
create table dept_partition2(deptno int, dname string, loc string)
partitioned by (month string, day string)
row format delimited fields terminated by '\t';
//创建目录
hive> dfs -mkdir -p /user/hive/warehouse/dept_partition2/month=202112/day=01;
//上传数据
hive> dfs -put /opt/module/datas/dept.txt /user/hive/warehouse/dept_partition2/month=202112/day=01;
//此时select不到数据,则需要执行修复命令
hive> msck repair table dept_partition2;
//再次查询数据
hive> select * from dept_partition2 where month='202112' and day="12";
//创建目录
hive> dfs -mkdir -p /user/hive/warehouse/dept_partition2/month=202112/day=01;
//上传数据
hive> dfs -put /opt/module/datas/dept.txt /user/hive/warehouse/dept_partition2/month=202112/day=01;
hive> alter table dept_partition add partition(month="20211201") partition(month="20211202")
//创建目录
hive> dfs -mkdir -p /user/hive/warehouse/dept_partition2/month=202112/day=01;
//上传数据
hive> load data local inpath 'opt/module/datas/dept.txt' into table dept_partition2 partition(monnth="202112",day="10");
//查询数据
hive (default)> select * from dept_partition2 where
month='201709' and day='10';
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。