一、Hive的存储格式
1. textfile格式
# 1500100001,施笑槐,22,女,文科六班
CREATE TABLE test.student_text(
id STRING,
name STRING,
age int,
gender STRING,
clazz STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE
;
# 添加数据
dfs -put /usr/local/soft/data/students.txt /user/hive/warehouse/test.db/student_text/
对于文本数据上传到HDFS中不会对其进行做任何压缩,只需要在建表时,指定其分隔符即可
一般用于刚采集来的数据
Hive默认文件存储格式 STORED AS TEXTFILE 可以去除
一般只有与其他系统由数据交互的接口表采用textfile 格式 : 数据从其他的业务系统采集后,会将数据以文本格式存储在HIVE中
2. sequenceFile
CREATE TABLE test.student_seq(
id STRING,
name STRING,
age int,
gender STRING,
clazz STRING
)
STORED AS SEQUENCEFILE
;
INSERT INTO TABLE test.student_seq SELECT * FROM test.student_text;
对于压缩格式来说,不能直接将文本类型的数据通过put 方式上传到表指定目录中
3. avro 格式
CREATE TABLE test.student_avro(
id STRING,
name STRING,
age int,
gender STRING,
clazz STRING
)
STORED AS AVRO
;
INSERT INTO TABLE test.student_avro SELECT * FROM test.student_text;
4. rcfile 格式
CREATE TABLE test.student_rc(
id STRING,
name STRING,
age int,
gender STRING,
clazz STRING
)
STORED AS RCFILE
;
INSERT INTO TABLE test.student_rc SELECT * FROM test.student_text;
(压缩格式,不能将文本数据 直接导入到表中,比文本格式占用内容小)
5. orcfile 格式 <推荐>
CREATE TABLE test.student_orc(
id STRING,
name STRING,
age int,
gender STRING,
clazz STRING
)
STORED AS ORCFILE
;
INSERT INTO TABLE test.student_orc SELECT * FROM test.student_text;
ORCFILE具有较强的压缩比,并且在查询数据时,性能也会比较高,通常对采集保存过的数据,做数据计算后,可以使用该存储格式进行保存
6. parquet 格式
CREATE TABLE test.student_par(
id STRING,
name STRING,
age int,
gender STRING,
clazz STRING
)
STORED AS PARQUET
;
INSERT INTO TABLE test.student_par SELECT * FROM test.student_text;
二、客户端操作
1.shell 客户端
hive直接启动
2.JDBC
-
- 启动JDBC服务:
nohup hive --service hiveserver2 > $HIVE_HOME/logs/hive_log.txt 2> &1 &
- 启动JDBC服务:
-
- 链接服务
beeline -u jdbc:hive2://master:10000 -n root
- 链接服务
三、基础操作(库,表)
1. 创建数据库,并指定其存储路径
create database data location '/dbdata'
创建数据库时不会在wearhouse中创建对应的目录,而是将库的路径指定到我们给定的路径下,并且库中的表会存储到该路径中
2. 创建数据库时指定其参数
create database test2 WITH DBPROPERTIES("create_name"="actXing","create_time"="20230605")
这里的参数用
desc命令可以查询到
3. 查看数据库
show databases
4. 查看库的详细信息
DESC DATABASE test2
DESC DATABASE extended test2 可以查看自定义信息
5. 删除数据库
drop database test2 删除空的数据库
drop database test cascade 不管是不是空的都能删除
6. 建表
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name -- EXTERNAL 外部表 -- IF NOT EXISTS 表示如果不存在那么创建
[(col_name data_type [COMMENT col_comment], ...)] -- 字段信息:字段名称 字段类型 COMMENT表示字段的注释信息
[COMMENT table_comment] -- 表的注释信息
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] -- PARTITIONED BY 用于构建分区表
[CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] -- 构建分桶表
[
[ROW FORMAT 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.) -- 表示查询数据创建对应的表
[LIKE table_name] -- 复制另外一个表的结构,不复制数据
1.创建表时,给定分隔符
CREATE TABLE IF NOT EXISTS student(
id STRING COMMENT '学生编号',
name STRING COMMENT '姓名',
age STRING COMMENT '年龄',
gender STRING COMMENT '性别',
clazz STRING COMMENT '班级'
)
COMMENT '学生表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
dfs -put /usr/local/soft/data/student1000.txt /user/hive/warehouse/learn1.db/student
-- 注意:在数据中是以逗号作为分隔符,但是建表时以制表符作为分隔符,最终产生的结果 第一列中包含所有的数据,其他列都是为NULL
drop table student;
CREATE TABLE IF NOT EXISTS student1(
id STRING COMMENT '学生编号',
name STRING COMMENT '姓名',
age STRING COMMENT '年龄',
gender STRING COMMENT '性别',
clazz STRING COMMENT '班级'
)
COMMENT '学生表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
- [STORED AS file_format] 表的存储格式
CREATE TABLE student_orc(
id STRING,
name STRING,
age int,
gender STRING,
clazz STRING
)
STORED AS ORCFILE
;
INSERT INTO TABLE student_orc SELECT * FROM student;
-- 注意:如果STORED AS 不去指定,那么默认是使用TextFILE作为其存储格式
3.创建表时,给定存储路径
dfs -mkdir /api/student/;
dfs -put /usr/local/soft/data/student1000.txt /api/student/;
CREATE TABLE IF NOT EXISTS student_localtion(
id STRING COMMENT '学生编号',
name STRING COMMENT '姓名',
age STRING COMMENT '年龄',
gender STRING COMMENT '性别',
clazz STRING COMMENT '班级'
)
COMMENT '学生表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/api/student/'
;
-- 应用场景:主要当数据已经存储在HDFS中时,可以创建表,将表的读取路径设置为数据存储路径
- 外部表
CREATE EXTERNAL TABLE IF NOT EXISTS student_external(
id STRING COMMENT '学生编号',
name STRING COMMENT '姓名',
age STRING COMMENT '年龄',
gender STRING COMMENT '性别',
clazz STRING COMMENT '班级'
)
COMMENT '学生表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/api/student/'
;
drop table student_external;
-- 当前数据是被两个表所依赖,
-- EXTERNAL 修饰的表,在被删除时,只会删除其元数据信息,而不会删除其具体的数据
-- 应用场景: 对于采集过的数据,可以使用外部表进行修饰,对于基于源表进行计算的相关表,可以使用普通表修饰
- AS select_statement 通过select语句查询数据并保存
CREATE TABLE IF NOT EXISTS student_select_23 AS SELECT * FROM student_localtion WHERE age = '23';
- TBLPROPERTIES 建表时指定配置参数
CREATE EXTERNAL TABLE IF NOT EXISTS student_pro(
id STRING COMMENT '学生编号',
name STRING COMMENT '姓名',
age STRING COMMENT '年龄',
gender STRING COMMENT '性别',
clazz STRING COMMENT '班级'
)
COMMENT '学生表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/api/student/'
TBLPROPERTIES("author"="act","create_time"="0605")
;
CREATE TABLE IF NOT EXISTS student_pro(
id STRING COMMENT '学生编号',
name STRING COMMENT '姓名',
age STRING COMMENT '年龄',
gender STRING COMMENT '性别',
clazz STRING COMMENT '班级'
)
COMMENT '学生表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/api/student/'
TBLPROPERTIES("EXTERNAL"="TRUE")
;
- 分区表
CREATE EXTERNAL TABLE IF NOT EXISTS student_partition(
id STRING COMMENT '学生编号',
name STRING COMMENT '姓名',
gender STRING COMMENT '性别',
clazz STRING COMMENT '班级'
)
COMMENT '学生表'
PARTITIONED BY (age STRING COMMENT '年龄')
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
;
INSERT INTO TABLE student_partition PARTITION(age='23') VALUES ("1500100007",'尚孤风','女','文科六班'),("1500100010",'羿彦昌','男','理科六班');
1500100007 尚孤风 23 女 文科六班
1500100010 羿彦昌 23 男 理科六班
1500100014 羿旭炎 23 男 理科五班
-- 分区表构建时,需要给定PARTITIONED BY关键字,在插入数据时,需要指定插入分区的分区信息,而该分区信息在HDFS中是以目录形式存在的
查看表
1.desc 表名;
2.describe FORMATTED 表名;
3.SHOW CREATE TABLE 表名;
- DESCRIBE EXTENDED 表名;