▌一、SQL的四种语句
▎【2.1】数据定义语言 DDL-data definition language
关键字如CREATE,DROp,ALTER定义数据库的逻辑结构,比如数据库、表、索引
▎【2.2】数据查询语言DQL-data query languag
关键字如SELECT查询操作
▎【2.3】数据操纵语言DML-data manipulation language
关键字如INSERT,UPDATE,DELETE对数据库的数据数据进行操作
▎【2.4】数据控制功能DCL-data control language,关键字如GRANT,REVOKE,COMMIT,ROLLBACK,对数据库的权限和安全级别进行操作
▌二、创建操作 ▎【2.1】创建数据库create database bd1814 comment "" with dbproperties(key=value,key=value) //key和value都要以字符串的形式
Hive中创建「数据库」本质上就是在HDFS上创建了一个「文件夹(目录)」
/usr/hive/warehouse 存储在hive中创建的数据库、表、数据
如果你用MySQL进行Hive元数据的存储,需要在MySQL中创建一个Hive数据库,相关的信息在hive-site.xml中进行设置,其中有很多表,存储了Hive元数据,其中一个表为DBS,其中记录了我们创建的所有数据库的元数据
▎【2.2】在原有数据库基础上添加信息的属性信息 alter database 数据库名 set dbproperties('属性名'='属性值');
▎【2.3】创建表
create [external] table if not exists 表名(列名 数据类型,列名 数据类型) location ""; //一般情况下location可以指定表存在哪个位置的, 也可以获取数据的位置
Hive创建表的本质就是在HDFS相应的仓库路径下创建一个文件目录,文件目录的名字就是表名,向表中添加的数据不存储到数据库中,而是存储到HDFS中。
▏在Hive中表的类型有两种:
- MANAGED_TABLE(内部表)
表达目录会创建正在HDFS的仓库(/user/hive/warehouse)目录下 - EXTERNAL_TABLE(外部表)
外部表会根据创建表式location关键字指定的路径创建表
若没有指定location,则表创建在和内部一样的路径下
▏Hive在创建表的时候会做两件事
- 创建HDFS上相对应的表目录
- 在元数据存储的数据库中存储对应表的元数据信息
▏内部表和外部表本质上是没有什么区别的,一旦发生drop的时候不同的特性就出现了
- drop时,内部表的数据目录会被删除,但是外部表的数据目录不会被删除
- drop时,内部表或外部表的元数据都会被删除
▏内部表和表和外部的转换
alter table 表名 set tblproperties('EXTERNAL'='TRUE/false')
ps :这里的TRUE一定要大写 false无所谓
内表转外表
alter table t_newuser set tblproperties('EXTERNAL'='TRUE')
外表转内表
alter table t_newuser set tblproperties('EXTERNAL'='false');
▎【2.4】创建表创建表时指定分隔
create [external] table if not exists 表名(列名 数据类型,列名 数据类型) row format delimited fields terminated by 't'▌三、查询操作
▎【3.1】查询hive中哪些数据库
show databases;
在没有创建其他数据库之前,hive会提供一个默认的数据库给我们使用default 在操作HiveQL在不指定数据库的前提下所有的操作都是在默认default数据中执行的 hive的数据库名和表名不区分大小写
▎【3.2】查询数据库信息
desc database bd1814; bd1814 hdfs://ip:9000/user/hive/warehouse/bd1814.db zxiao USER 如果我们想要看,我们使用with dbproperties添加的额外属性 desc database extended bd1814; 选中数据库 use 数据库名;▌四、删除操作
▎【4.1】删除数据库
drop database 数据库名 //只能删没有表的 drop database 数据库名 cascade; //级联删除,都能删
▎【4.2】删除表
drop table 表名;▌五、加载数据
▎【5.1】本地加载
load data local inpath '本地数据路径' into/[overwrite into] table 表名 into关键字是追加 overwirter关键字是覆盖
本质上就是将文件加载到表对应的目录下
▎【5.2】HDFS加载
load data inpath 'HDFS路径' into table 表名 into关键字覆盖追加一体
▎【5.3】通过查询语句向表中添加数据
insert into table 插入的表名 select * from 存有数据表 into 是追加 insert overwrite table 插入的表名 select * from 存有数据表 overwriter 是覆盖
▎【5.4】Hive添加数据问题
hive使用是严格的「读时」模式。
在加载数据的时候是不检查数据的完整性。读时若发现数据的个格式不正确,此时就使用null来进行代替。
在hive创建表的时如果不指定数据中的分割符号,默认使用的是系统提供分割符号
▎【5.5】总结:
若是使用本地加载文件,相当于将文件拷贝一份并上传到HDFS下/user/hive/warehouse对应数据库下的表中存储中文件。
若使用HDFS加载文件,相当于将文件剪切到HDFS下/user/hive/warehouse对应数据库下的表中存储中文件。
▎【5.6】复制表
- 使用like关键字
复制的是分区的表也可以复制普通表 复制表但是不带有数据 --> 复制一份表的结构 create table if not exists t_4 like t_5; 复制表并带有数据 create table if not exists t_6 like t_5 location '/user/hive/warehouse/bd1814.db/t_5';
这个复制因我们使用location关键字,所以这里t_6并会不出现在HDFS的目录中 位置这里的t_6这张表和t_5这张表共享数据 我们所有正在hive下创建的数据库或表都是目录
- 使用select进行复制
通过有查询的形式复制 select * from ps:个人是非常推荐的 而且复制数据非常的灵活 这种方式根创建表一样会有 元数据和目录都会被创建 create table if not exists 要创建的表 as select * from 提供数据和表结构的表 where 添加条件; ps: where 可以不写 根据需求来 create table if not exists t_7 as select * from t_user where uid>1;▌六、表属性的修改 ▎【6.1】修改表明
alter table 原表名 rename to 新表名
▎【6.2】修改列的名字或者是数据类型
alter table 表名 change column 原字段名 新字段名 字段数据类型
▎【6.3】修改字段的顺序
使用after关键字.将修改后的字段放到某个字段的后面 alter table 表名 change column 原字段名 新字段名 字段数据类型 after 某个字段即可 但是原始数据的顺序还是原来的顺序,所以,可能会发生解析错误
▎【6.4】添加字段
alter table 表名 add columns (字段名 数据类型 ....);
▎【6.5】删除字段
alter table 表名 replace columns(字段名,数据类型....);



