🌼库操作
创建数据库
CREATE DATABASE [IF NOT EXISTS] database_name[COMMENT database_comment][LOCATION hdfs_path][WITH DBPROPERTIES (property_name=property_value, ...)];
1)创建一个数据库,数据库在HDFS上的默认存储路径 是/user/hive/warehouse/*.db。
2)创建一个数据库,指定数据库在HDFS上存放的位置,指定的这个文件夹就是数据库,虽然名字没有起得相同。
hive (default)> create database db_hive2 location '/db_hive2';
查询数据库
显示数据库
1)显示数据库
hive> show databases;
2)过滤显示查询的数据库
hive> show databases like 'db_hive*';OKdb_hivedb_hive_1
查看数据库详情
1)显示数据库信息
hive> desc database db_hive;OKdb_hive hdfs://hadoop102:9000/user/hive/warehouse/db_hive.db atguiguUSER
2)显示数据库详细信息,extended
hive> desc database extended db_hive;OKdb_hive hdfs://hadoop102:9000/user/hive/warehouse/db_hive.db atguiguUSER
切换当前数据库
hive (default)> use db_hive;
修改数据库(唯一能修改的东西DBproperties)
用户可以使用ALTER DATABASE命令为某个数据库的DBPROPERTIES设置键-值对属性值,来描述这个数据库的属性信息。
数据库的其他元数据信息都是不可更改的,包括数据库名和数据库所在的目录位置。
hive (default)> alter database db_hive set dbproperties('createtime'='20170830');
在hive中查看修改结果
hive> desc database extended db_hive;db_name comment location owner_name owner_type parametersdb_hive hdfs://hadoop102:8020/user/hive/warehouse/db_hive.db atguigu USER {createtime=20170830}
删除数据库
1)删除空数据库
hive>drop database if exists db_hive2;
2)如果数据库不为空,可以采用cascade命令,强制删除
hive> drop database db_hive;FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. InvalidOperationException(message:Database db_hive is not empty. One or more tables exist.)hive> drop database db_hive cascade;
🌻表操作
建表语法
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][STORED AS file_format][LOCATION hdfs_path][TBLPROPERTIES (property_name=property_value, ...)]//一般用来指明压缩格式,一定放在最后面[AS select_statement][LIKE table_name][null default as 'xxx']
字段解释说明
(1)CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS 选项来忽略这个异常。
(2)EXTERNAL关键字可以让用户创建一个外部表,在建表的同时可以指定一个指向实际数据的路径(LOCATION),在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
(3)COMMENT:为表和列添加注释。不能和row format连用,因为都是注释
(4)PARTITIONED BY创建分区表
(5)CLUSTERED BY创建分桶表
(6)SORTED BY不常用,对桶中的一个或多个列另外排序
(7)ROW FORMAT
DELIMITED
[FIELDS TERMINATED BY char]
[COLLECTION ITEMS TERMINATED BY char]:与列表字段配合拆分成数组
[MAP KEYS TERMINATED BY char] :与map字段配合拆分成数组
[LINES TERMINATED BY char]
| SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, …)]
用户在建表的时候可以自定义SerDe或者使用自带的SerDe。如果没有指定ROW FORMAT 或者ROW FORMAT DELIMITED,将会使用自带的SerDe。在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的SerDe,Hive通过SerDe确定表的具体的列的数据。
SerDe是Serialize/Deserilize的简称, hive使用Serde进行行对象的序列与反序列化。
(8)STORED AS指定存储文件类型
常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、RCFILE(列式存储格式文件)
如果文件数据是纯文本,可以使用STORED AS TEXTFILE。如果数据需要压缩,使用STORED AS SEQUENCEFILE。
列式存储:orc、parquet
(9)LOCATION :指定表在HDFS上的存储位置。
(10)AS:后跟查询语句,根据查询结果创建表,不会继承select语句属性。
(11)LIKE允许用户复制现有的表结构,但是不复制数据。
位置说明
创建好的表在在hdfs中也是文件夹的存在,表中的数据则是以文件的形式存在。
上传文件到hdfs中就是上传数据到表中,注意分割符要相同!
示例
注意:分区字段不包含在括号中
DROP TABLE IF EXISTS ods_activity_info_full;CREATE EXTERNAL TABLE ods_activity_info_full(`id` STRING COMMENT '活动id',`activity_name` STRING COMMENT '活动名称',`activity_type` STRING COMMENT '活动类型',`activity_desc` STRING COMMENT '活动描述',`start_time` STRING COMMENT '开始时间',`end_time` STRING COMMENT '结束时间',`create_time` STRING COMMENT '创建时间') COMMENT '活动信息表'PARTITIONED BY (`dt` STRING)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'NULL DEFINED AS ''LOCATION '/warehouse/gmall/ods/ods_activity_info_full/';
管理表
1)理论
默认创建的表都是所谓的管理表,有时也被称为内部表。因为这种表,Hive会(或多或少地)控制着数据的生命周期。Hive默认情况下会将这些表的数据存储在由配置项hive.metastore.warehouse.dir(例如,/user/hive/warehouse)所定义的目录的子目录下。 当我们删除一个管理表时,Hive也会删除这个表中数据。管理表不适合和其他工具共享数据。
2)案例实操
(0)原始数据
| 1001 | ss1 |
|---|---|
| 1002 | ss2 |
| 1003 | ss3 |
(1)普通创建表
create table if not exists student(id int, name string)row format delimited fields terminated by '\t'stored as textfilelocation '/user/hive/warehouse/student';
(2)根据查询结果创建表(查询的结果会添加到新创建的表中)
create table if not exists student2 as select id, name from student;
(3)根据已经存在的表结构创建表
create table if not exists student3 like student;
(4)查询表的类型(库用的是extended)
hive (default)> desc formatted student2;Table Type: MANAGED_TABLE
(5)删除管理表,并查看表数据是否还存在
hive (default)> drop table student2;
外部表
1)
因为表是外部表,所以Hive并非认为其完全拥有这份数据。删除该表并不会删除掉这份数据,不过描述表的元数据信息会被删除掉
所以作用:防止手滑误删
恢复:**
MSCK REPAIR TABLE table_name
2)管理表和外部表的使用场景
每天将收集到的网站日志定期流入HDFS文本文件。在外部表(原始日志表)的基础上做大量的统计分析,用到的中间表、结果表使用内部表存储,数据通过SELECT+INSERT进入内部表。
3)案例实操
分别创建部门和员工外部表,并向表中导入数据。
(0)原始数据
dept:
10 ACCOUNTING 170020 RESEARCH 180030 SALES 190040 OPERATIONS 1700
emp:
7369 SMITH CLERK 7902 1980-12-17 800.00 207499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 307521 WARD SALESMAN 7698 1981-2-22 1250.00 500.00 307566 JONES MANAGER 7839 1981-4-2 2975.00 207654 MARTIN SALESMAN 7698 1981-9-28 1250.00 1400.00 307698 BLAKE MANAGER 7839 1981-5-1 2850.00 307782 CLARK MANAGER 7839 1981-6-9 2450.00 107788 SCOTT ANALYST 7566 1987-4-19 3000.00 207839 KING PRESIDENT 1981-11-17 5000.00 107844 TURNER SALESMAN 7698 1981-9-8 1500.00 0.00 307876 ADAMS CLERK 7788 1987-5-23 1100.00 207900 JAMES CLERK 7698 1981-12-3 950.00 307902 FORD ANALYST 7566 1981-12-3 3000.00 207934 MILLER CLERK 7782 1982-1-23 1300.00 10
(1)上传数据到HDFS
hive (default)> dfs -mkdir -p /company/dept;hive (default)> dfs -mkdir -p /company/emp;hive (default)> dfs -put /opt/module/hive/datas/dept.txt /company/dept;hive (default)> dfs -put /opt/module/hive/datas/emp.txt /company/emp;
(2)建表语句,创建外部表
创建部门表
create external table if not exists dept(deptno int,dname string,loc int)row format delimited fields terminated by '\t'location '/company/dept';
创建员工表
create external table if not exists emp(empno int,ename string,job string,mgr int,hiredate string,sal double,comm double,deptno int)row format delimited fields terminated by '\t'location '/company/emp';
(3)查看创建的表
hive (default)>show tables;
(4)查看表格式化数据
hive (default)> desc formatted dept;Table Type: EXTERNAL_TABLE
(5)删除外部表
hive (default)> drop table dept;
外部表删除后,hdfs中的数据还在,但是metadata中dept的元数据已被删除
管理表与外部表的互相转换(tblproperties)
实现方式:修改属性—>tblproperties
(1)查询表的类型
hive (default)> desc formatted student;Table Type: MANAGED_TABLE
(2)修改内部表student为外部表(属性内部严格区分大小写)
alter table student set tblproperties('EXTERNAL'='TRUE');
(3)查询表的类型EXTERNAL_TABLE
hive (default)> desc formatted student;Table Type: EXTERNAL_TABLE
(4)修改外部表student为内部表(属性内部严格区分大小写)
alter table student set tblproperties('EXTERNAL'='FALSE');
(5)查询表的类型MANAGED_TABLE
hive (default)> desc formatted student;Table Type: MANAGED_TABLE
注意:(‘EXTERNAL’=’TRUE’)和(‘EXTERNAL’=’FALSE’)为固定写法,区分大小写!
修改表
重命名表
1)语法
ALTER TABLE table_name RENAME TO new_table_name
2)实操案例
hive (default)> alter table student2 rename to student3;
增加、修改和删除表分区
增加/修改/替换列信息
1)语法
(1)更新列
更新列,列名可以随意修改,列的类型只能小改大,不能大改小(遵循自动转换规则)
ALTER TABLE table_name CHANGE[COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name]
(2)增加和替换列
ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)
注:ADD是代表新增一字段,字段位置在所有列后面(partition列前),REPLACE则是表示替换表中所有字段,REPLACE使用的时候,字段的类型要跟之前的类型对应上,数量可以减少或者增加,其实就是包含了更新列,增加列,删除列的功能。
2)实操案例
(1)查询表结构
hive> desc dept;
(2)添加列
hive (default)> alter table dept add columns(deptdesc string);
(3)查询表结构
hive> desc dept;
(4)更新列
hive (default)> alter table dept change column deptdesc desc string;
(5)查询表结构
hive> desc dept;
(6)替换列
hive (default)> alter table dept replace columns(deptno string, dname string, loc string);
(7)查询表结构
hive> desc dept;
删除表
hive (default)> drop table dept;
清空表
注意:Truncate只能清空管理表,不能清空外部表中数据
hive (default)> truncate table student;
