学习大数据的第51天(Hive篇)——day01
Hive框架
Hive是什么
Hive 是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL ),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 HQL ,它允许熟悉 SQL 的用户查询数据。同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。
Hive是SQL解析引擎,它将SQL语句转译成M/R Job然后在Hadoop执行。
Hive的表其实就是HDFS的目录,按表名把文件夹分开。如果是分区表,则分区值是子文件夹,可以直接在M/R Job里使用这些数据。
Hive相当于hadoop的客户端工具,部署时不一定放在集群管理节点中,可以放在某个节点上
Hive概念及架构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JepzEyTh-1649849736428)(C:\Users\stu\AppData\Roaming\Typora\typora-user-images\image-20220411130010913.png)]
Hive与传统数据库比较
查询语言 | HiveQL | SQL |
---|---|---|
数据存储位置 | HDFS | Raw Device or 本地FS |
数据格式 | 用户定义 | 系统决定 |
数据更新 | 不支持(1.x以后版本支持) | 支持 |
索引 | 新版本有,但弱 | 有 |
执行 | MapReduce | Executor |
执行延迟 | 高 | 低 |
可扩展性 | 高 | 低 |
数据规模 | 大 | 小 |
Hive基本操作
Hive的存储格式:
Hive的数据存储基于Hadoop HDFS。
Hive没有专门的数据文件格式,常见的有以下几种。
1、TEXTFILE
默认的存储格式
TEXTFILE 存储文件默认每一行就是一条记录,可以指定任意的分隔符进行字段间的分割。但这个格式无压缩,需要的存储空间很大
2、SEQUENCEFILE
3、AVRO
4、RCFILE
5、ORCFILE
6、PARQUET
查看student的信息,包括存储格式
show create table student;
STORED AS INPUTFORMAT
‘org.apache.hadoop.mapred.TextInputFormat’测试几种存储格式:
mkdir /usr/local/soft/hive-3.1.2/data/
上传数据至data目录中
3.创建TEXTFILE学生信息表
create table students(id bigint comment ‘学生id’,
name string comment ‘学生姓名’,
age int comment ‘学生年龄’,
gender string comment ‘学生性别’,
clazz string comment ‘学生班级’
) comment ‘学生信息表’
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘,’
STORED AS TEXTFILE;4.上传数据至HDFS
dfs -put /usr/local/soft/hive-3.1.2/data/ /user/hive/warehouse/filetest.db/students;使用hive自带的load上传数据到hdfs上
load data local inpath “/usr/local/soft/hive-3.1.2/data/students.txt” into table students;
5.通过查看HDFS路径可以看到数据大小没有发生变化 大小为37M
6.创建RCFile格式的学生信息表
(是Hadoop中第一个列文件格式。能够很好的压缩和快速的查询性能。通常写操作比较慢,比非列形式的文件格式需要更多的内存空间和计算量。)
create table students_rcFile(
id bigint comment ‘学生id’,
name string comment ‘学生姓名’,
age int comment ‘学生年龄’,
gender string comment ‘学生性别’,
clazz string comment ‘学生班级’
) comment ‘学生信息表’
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘,’
STORED AS RCFile;7.插入数据:
insert into table students_rcFile select * from students;8.通过查看HDFS路径可以看到数据经过压缩大小为26.44 M
9.创建ORCFile格式的学生信息表
create table students_orc(
id bigint comment ‘学生id’,
name string comment ‘学生姓名’,
age int comment ‘学生年龄’,
gender string comment ‘学生性别’,
clazz string comment ‘学生班级’
) comment ‘学生信息表’
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘,’
STORED AS ORC;10.插入数据:
insert into table students_orc select * from students;11.通过查看HDFS路径可以看到数据经过压缩大小为 220.38 KB,同时插入数据时与RCFile格式时间相差不大
12.创建Parquet格式的学生信息表
create table students_parquet(
id bigint comment ‘学生id’,
name string comment ‘学生姓名’,
age int comment ‘学生年龄’,
gender string comment ‘学生性别’,
clazz string comment ‘学生班级’
) comment ‘学生信息表’
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘,’
STORED AS PARQUET;13.insert into table students_parquet select * from students;
14.通过查看HDFS路径可以看到数据经过压缩大小为 3.01 MB 写入数据所花费时间相比ORCFile更少
实际工作中ORCfile用的多,埋点数据比较多(埋点数据:设置埋点收集日志数据,将程序中的对象内容进行写入日志)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GECEWAxS-1649849736431)(C:\Users\stu\AppData\Roaming\Typora\typora-user-images\image-20220411160409996.png)]
结论:ORCFile存储文件读操作效率最高
耗时比较:ORC<Parque’t<RC<Text
开启jdbc链接
hiveserver2 文件与jdbc操作有关,端口号为10000
hive.server2.thrift.port 10000 hive.server2.thrift.bind.host master开启jdbc服务
hive --service hiveserver2
cd /usr/local/soft/hive-3.1.2/bin
连接命令:
beeline -u jdbc:hive2://master:10000 -n root
注意: 如果报以下错误:
hadoop.proxyuser.root.groups * 重启集群:start-all.sh
Error: Could not open client transport with JDBC Uri: jdbc:hive2://master:10000:
Failed to open new session: java.lang.RuntimeException:
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException):
User: root is not allowed to impersonate root (state=08S01,code=0)
解决方法:
先关闭Hadoop集群 :stop-all.sh
配置core-site.xml:添加如下内容:
hadoop.proxyuser.root.hosts
*
3.查看服务有没有启动:(hive的JDBC启动非常慢,需要等待一定时间,Hive Session ID出现4个以后基本可以看到端口启动)
netstat -nplt | grep 10000jps中 会多次出一个进程:
RunJar
Hive的metastore(元数据存储在哪?)
metastore是hive元数据的集中存放地。
metastore默认使用内嵌的derby数据库作为存储引擎
Derby引擎的缺点:一次只能打开一个会话
使用MySQL作为外置存储引擎,多用户同时访问
元数据库详解见:查看mysql SDS表和TBLS表
https://blog.csdn.net/haozhugogo/article/details/73274832
HIVE基本语法
数据库的DDL语言(Database Defind Lagerage)数据库定义语言
创建数据库 create database xxxxx;
查看数据库 show databases;删除数据库 drop database tmp;
强制删除数据库:drop database tmp cascade;
查看表:SHOW TABLES;
查看表的元信息:
desc test_table;
describe extended test_table;
describe formatted test_table;
查看建表语句:show create table table_XXX
重命名表:
alter table test_table rename to new_table;
修改列数据类型:alter table lv_test change column colxx string;
增加、删除分区:
alter table test_table add partition (pt=xxxx)
alter table test_table drop if exists partition(…);查看数据库信息:
desc database test_database;
查看数据库创建的详细信息,包括配置的参数:
desc database extended test_database2;
建库语句
CREATE DATABASE [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[WITH DBPROPERTIES (property_name=property_value, …)];
建表语句
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name – EXTERNAL表示外部表的标志
[(col_name data_type [COMMENT col_comment], …)] – 列名 数据类型 注释信息
[COMMENT table_comment] – 表的注释信息
[PARTITIONED BY (col_name data_type [COMMENT col_comment], …)] – PARTITIONED BY 构建分区表 包括 列名 数据类型 注释信息
[CLUSTERED BY (col_name, col_name, …) --CLUSTERED BY 分桶 列名
[SORTED BY (col_name [ASC|DESC], …)] INTO num_buckets BUCKETS] – SORTED BY 分桶中的排序 INTO num_buckets BUCKETS 具体分成多少桶
[
[ROW FORMAT row_format] – 表示数据的分隔信息
[STORED AS file_format] – 表示存储格式
| STORED BY ‘storage.handler.class.name’ [ WITH SERDEPROPERTIES (…) ] (Note: only available starting with 0.6.0) --自定义存储类
]
[LOCATION hdfs_path] – 表的存储位置
[TBLPROPERTIES (property_name=property_value, …)] (Note: only available starting with 0.6.0) – 表示表的配置信息
[AS select_statement] (Note: this feature is only available starting with 0.5.0.) – AS 通过查询表创建(接查询语句)
注意新建表不允许是外部表。
外部表和普通表的区别
1,外部表的路径可以自定义,内部表的路径需要在 hive/warehouse/目录下
2,删除表后,普通表数据文件和表信息都删除。外部表仅删除表信息
笔记
测试几种存储格式:
1. mkdir /usr/local/soft/hive-3.1.2/data/
2. 上传数据至data目录中
3.创建TEXTFILE学生信息表
create table students(
id bigint comment '学生id',
name string comment '学生姓名',
age int comment '学生年龄',
gender string comment '学生性别',
clazz string comment '学生班级'
) comment '学生信息表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
4.上传数据至HDFS
dfs -put /usr/local/soft/hive-3.1.2/data/ /user/hive/warehouse/filetest.db/students;
# 使用hive自带的load上传数据到hdfs上
load data local inpath "/usr/local/soft/hive-3.1.2/data/students.txt" into table students;
5.通过查看HDFS路径可以看到数据大小没有发生变化 大小为37M
6.创建RCFile格式的学生信息表
# (是Hadoop中第一个列文件格式。能够很好的压缩和快速的查询性能。通常写操作比较慢,比非列形式的文件格式需要更多的内存空间和计算量。)
create table students_rcFile(
id bigint comment '学生id',
name string comment '学生姓名',
age int comment '学生年龄',
gender string comment '学生性别',
clazz string comment '学生班级'
) comment '学生信息表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS RCFile;
7.插入数据:
insert into table students_rcFile select * from students;
8.通过查看HDFS路径可以看到数据经过压缩大小为26.44 M
9.创建ORCFile格式的学生信息表
create table students_orc(
id bigint comment '学生id',
name string comment '学生姓名',
age int comment '学生年龄',
gender string comment '学生性别',
clazz string comment '学生班级'
) comment '学生信息表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS ORC;
10.插入数据:
insert into table students_orc select * from students;
11.通过查看HDFS路径可以看到数据经过压缩大小为 220.38 KB,同时插入数据时与RCFile格式时间相差不大
12.创建Parquet格式的学生信息表(比较适合存储json数据)
create table students_parquet(
id bigint comment '学生id',
name string comment '学生姓名',
age int comment '学生年龄',
gender string comment '学生性别',
clazz string comment '学生班级'
) comment '学生信息表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS PARQUET;
13.insert into table students_parquet select * from students;
14.通过查看HDFS路径可以看到数据经过压缩大小为 3.01 MB 写入数据所花费时间相比ORCFile更少
》》》》》》》》》》》》》》》》》》》》》》》 开启HIVE JDBC 连接 《《《《《《《《《《《《《《《《《《《《《《《《《《《
1.开启命令:
hive --service hiveserver2
2.连接命令:
beeline -u jdbc:hive2://master:10000 -n root
注意: 如果报以下错误:
Error: Could not open client transport with JDBC Uri: jdbc:hive2://master:10000:
Failed to open new session: java.lang.RuntimeException:
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException):
User: root is not allowed to impersonate root (state=08S01,code=0)
解决方法:
先关闭Hadoop集群 :stop-all.sh
配置core-site.xml:添加如下内容:
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
重启集群:start-all.sh
3.查看服务有没有启动:(hive的JDBC启动非常慢,需要等待一定时间,Hive Session ID出现4个以后基本可以看到端口启动)
netstat -nplt | grep 10000
《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《HIVE需要修改的东西》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
1).修改字段注释字符集
alter table COLUMNS_V2 modify column COMMENT varchar(256) character set utf8;
2).修改表注释字符集
alter table TABLE_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
3).修改分区表参数,以支持分区键能够用中文表示
alter table PARTITION_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
alter table PARTITION_KEYS modify column PKEY_COMMENT varchar(4000) character set utf8;
4).修改索引注解(可选)
alter table INDEX_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
5).修改库注释字符集
alter table DBS modify column DESC varchar(4000) character set utf8;
《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《HIVE基本语法》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
CREATE DATABASE [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[WITH DBPROPERTIES (property_name=property_value, ...)];
1. 创建数据库
CREATE DATABASE IF NOT EXISTS my_database;
DROP DATABASE my_database;
CREATE DATABASE IF NOT EXISTS my_database COMMENT "测试数据库创建";
通过指定的HDFS路径创建数据库
dfs -mkdir /testDatabase;
-- CREATE DATABASE IF NOT EXISTS test_database COMMENT "测试数据库创建" LOCATION "/testDatabase";
创建数据库时增加配置信息
CREATE DATABASE IF NOT EXISTS test_database2 COMMENT "测试数据库创建" WITH DBPROPERTIES("author"="xingtong","application"="save base data");
2. 查看数据库信息
DESC DATABASE my_database;
注意:如果中文显示乱码,请修改MYSQL中hive库的DBS中的DESC字段的字符集为utf8
alter table DBS modify column DESC varchar(4000) character set utf8;
desc database extended test_database2;
查看数据库创建的详细信息,包括配置的参数
SHOW DATABASE;
3. 删除数据库
3.1 DROP DATABASE my_database;
如果数据库不为空 删除会报错: message:Database my_database is not empty.
3.2 DROP DATABASE my_database cascade;
强制删除数据库
4. 创建表
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name -- EXTERNAL表示外部表的标志
[(col_name data_type [COMMENT col_comment], ...)] -- 列名 数据类型 注释信息
[COMMENT table_comment] -- 表的注释信息
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] -- PARTITIONED BY 构建分区表 包括 列名 数据类型 注释信息
[CLUSTERED BY (col_name, col_name, ...) --CLUSTERED BY 分桶 列名
[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] -- SORTED BY 分桶中的排序 INTO num_buckets BUCKETS 具体分成多少桶
[
[ROW FORMAT row_format] -- 表示数据的分隔信息
[STORED AS file_format] -- 表示存储格式
| STORED BY 'storage.handler.class.name' [ WITH SERDEPROPERTIES (...) ] (Note: only available starting with 0.6.0) --自定义存储类
]
[LOCATION hdfs_path] -- 表的存储位置
[TBLPROPERTIES (property_name=property_value, ...)] (Note: only available starting with 0.6.0) -- 表示表的配置信息
[AS select_statement] (Note: this feature is only available starting with 0.5.0.) -- AS 通过查询表创建(接查询语句)
4.1 ROW FORMAT用法
CREATE TABLE IF NOT EXISTS filetest.total_score(
student_id STRING COMMENT "学生编号",
score int COMMENT "总分"
)ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t"
STORED AS TEXTFILE;
load data local inpath "/usr/local/soft/hive-3.1.2/data/total_score.txt" into table filetest.total_score;
+-------------------------+--------------------+
| total_score.student_id | total_score.score |
+-------------------------+--------------------+
| 1500100001 | 406 |
| 1500100002 | 440 |
| 1500100003 | 359 |
| 1500100004 | 421 |
| 1500100005 | 395 |
| 1500100006 | 314 |
| 1500100007 | 418 |
| 1500100008 | 363 |
| 1500100009 | 251 |
| 1500100010 | 402 |
+-------------------------+--------------------+
CREATE TABLE IF NOT EXISTS filetest.total_score2(
student_id STRING COMMENT "学生编号",
score int COMMENT "总分"
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ","
STORED AS TEXTFILE;
load data local inpath "/usr/local/soft/hive-3.1.2/data/total_score.txt" into table filetest.total_score2;
注意:如果数据和分隔符不匹配则原始数据中的所有数据会变成新表中的一列数据
+--------------------------+---------------------+
| total_score2.student_id | total_score2.score |
+--------------------------+---------------------+
| 1500100001 406 | NULL |
| 1500100002 440 | NULL |
| 1500100003 359 | NULL |
| 1500100004 421 | NULL |
| 1500100005 395 | NULL |
| 1500100006 314 | NULL |
| 1500100007 418 | NULL |
| 1500100008 363 | NULL |
| 1500100009 251 | NULL |
| 1500100010 402 | NULL |
+--------------------------+---------------------+
4.2 LOCATION用法
dfs -mkdir /testDatabase/total_score;
CREATE TABLE IF NOT EXISTS filetest.total_score3(
student_id STRING COMMENT "学生编号",
score int COMMENT "总分"
)ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t"
STORED AS TEXTFILE
LOCATION "/testDatabase/total_score";
load data local inpath "/usr/local/soft/hive-3.1.2/data/total_score.txt" into table filetest.total_score3;
4.3 EXTERNAL 用法
dfs -mkdir /testDatabase/total_score;
CREATE EXTERNAL TABLE IF NOT EXISTS filetest.total_score3(
student_id STRING COMMENT "学生编号",
score int COMMENT "总分"
)ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t"
STORED AS TEXTFILE
LOCATION "/testDatabase/total_score";
load data local inpath "/usr/local/soft/hive-3.1.2/data/total_score.txt" into table filetest.total_score3;
CREATE EXTERNAL TABLE IF NOT EXISTS filetest.total_score4(
student_id STRING COMMENT "学生编号",
score int COMMENT "总分"
)ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t"
STORED AS TEXTFILE;
load data local inpath "/usr/local/soft/hive-3.1.2/data/total_score.txt" into table filetest.total_score4;
DROP TABLE total_score4; -- 数据依然存在
注: 外部表与普通内部表的区别在于:外部表删除表时不会删除对应的数据 并且和表数据存储位置无关
4.4 STORED AS 用法:设置数据存储格式
使用方法一:
CREATE EXTERNAL TABLE IF NOT EXISTS filetest.total_score5(
student_id STRING COMMENT "学生编号",
score int COMMENT "总分"
)ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t"
STORED AS ORC;
--load data local inpath "/usr/local/soft/hive-3.1.2/data/total_score.txt" into table filetest.total_score5;
注意:如果数据存储格式为压缩格式,那么就不能直接将文本数据加载至表中
INSERT INTO TABLE filetest.total_score5 SELECT * FROM filetest.total_score;
使用方法二:
通过查询语句结果去创建一个新表
CREATE TABLE IF NOT EXISTS filetest.total_score7
STORED AS ORC
AS SELECT student_id,score FROM filetest.total_score;
4.5 TBLPROPERTIES 用法
CREATE EXTERNAL TABLE IF NOT EXISTS filetest.total_score8(
student_id STRING COMMENT "学生编号",
score int COMMENT "总分"
)ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t"
STORED AS TEXTFILE
TBLPROPERTIES("author"="xing","application"="学生表,保存学生的总分,如有错误请联系 XXX");
4.6 AS 用法
CREATE TABLE IF NOT EXISTS filetest.total_score8
STORED AS ORC
AS SELECT student_id,score FROM filetest.total_score;
4.7 PARTITIONED BY 分区
-- 将学生信息表中不同性别的学生进行分区保存
CREATE TABLE IF NOT EXISTS filetest.partition_student(
id STRING COMMENT "学生ID",
name STRING COMMENT "学生姓名",
age int COMMENT "年龄",
clazz STRING COMMENT "班级"
) PARTITIONED BY (gender STRING COMMENT "性别分区")
STORED AS TEXTFILE;
INSERT INTO TABLE filetest.partition_student PARTITION(gender="nan")
SELECT id,name,age,clazz FROM filetest.students WHERE gender="男" limit 10;
INSERT INTO TABLE filetest.partition_student PARTITION(gender='nan')
SELECT "1500100002","吕金鹏",24,"文科六班"
5.查看表信息
DESC table_name
查看表的字段信息
DESC FORMATTED table_name
查看表的详细信息
6.删除表
DROP TABLE table_name;
删除表时,HDFS上的数据也会跟着删除掉