[Hive] 存储类型及数据操作

121 阅读6分钟

一、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

    1. 启动JDBC服务: nohup hive --service hiveserver2 > $HIVE_HOME/logs/hive_log.txt 2> &1 &
    1. 链接服务 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 ',';
  1. [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中时,可以创建表,将表的读取路径设置为数据存储路径
  1. 外部表
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 修饰的表,在被删除时,只会删除其元数据信息,而不会删除其具体的数据
--  应用场景: 对于采集过的数据,可以使用外部表进行修饰,对于基于源表进行计算的相关表,可以使用普通表修饰
  1. AS select_statement 通过select语句查询数据并保存

CREATE TABLE IF NOT EXISTS student_select_23 AS SELECT * FROM student_localtion WHERE age = '23';
  1. 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")
;
  1. 分区表
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 表名;

  1. DESCRIBE EXTENDED 表名;