hive是属于批处理系统,所以最大的缺点就是不支持行级别的数据插入,删除,更新,也不支持事务机制。hive中数据库的概念本质上也仅仅是mysql(或别的存储元数据的数据库)表中一个目录或者命令空间(namespace),但是对于大集群来说,这又必不可少,因为只有这样才能将生产表组成逻辑组,形成组织层次结构。
1.hive关于数据库的操作
1.hive中创建数据库 hive> create database fdm_sor; 或者防止库存在报错,加上判断语句 hive> create database if not exists fdm_sor; 因为hive中数据实际存放在hdfs上,所以每个hive数据库创建时,hdfs上hive仓库中/user/hive/warehouse中都会建立一个对应的子目录。 比如 /user/hive/warehouse/fdm_sor.db,但是对于默认default数据库,则没有自己的目录。但是一般创建数据库时也可以指定存储目录(不常用) hive> create database fdm_sor_1 > location '/home/robot/fdm_sor.db' 此外还可以创建数据库时给数据库添加描述,尤其很多数据库时,方便后期维护和管理 hive>create database fdm_sor2 comment '这是我的测试数据库' 2.显示hive中有哪些数据库,以及使用特定数据库 hive> show databases; hive> show databases like 'fdm_.*' --查看以fdm_开头的数据库名,可以使用正则表达式模糊查询 hive> use fdm_sor; --使用fdm_sor数据库,如果不指定使用数据库,默认使用default数据库 3.查看数据库详情 hive (fdm_sor)> describe database fdm_sor; db_name comment location owner_name owner_type parameters fdm_sor hdfs://hadoop102:9000/user/hive/warehouse/fdm_sor.db robot USER 同理如果想查看更加详细的数据库详情,可以使用describe database extended fdm_sor; 4.查看当前数据库下所有的表 hive>show tables hive > show tables like 'aa.*' 5.删除和修改数据库 hive (staff)> drop database staff; FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. InvalidOperationException (message:Database staff is not empty. One or more tables exist.) hive中不允许直接删除一个有表的数据库,用户要想删除数据库,要先删除表,再删除数据库。或者直接加cascade关键字,强制执行 hive> drop database if exists aaa cascade ; OK Time taken: 0.169 seconds2.hive中关于表的常见操作
1.关于创建表的操作见博客:
hive创建表的常见操作和各种属性的使用
Hive中创建表的各种方式以及区别详解
2.删除表
hive> drop table if exists aaa;
对于管理表(内部表)表的元数据和表内的数据都会被删除,如果hdfs开启了回收站功能,会被移到.trash目录下
对于外部表,表的元数据信息同样会被删除,只是表中的数据还会存放在hdfs上,不会被删除
3.修改表,只修改表的模式,不会修改表中数据
1.给表重命名,但是表的数据存放位置不会变 hive> alter table aaa rename to bbbb; 2.给表增加,修改和删除分区 hive> alter table aaa add if not exists partition(year='2011',month='11') --同时增加一个或多个分区 hive>alter table aaa add partition (statis_date='201111') location‘/user/hive/warehouse/201111’ partition(statis_date='201112')location 'user/hive/warehouse/201112' 删除特定分区,如果是内部表,元数据和数据同时被删除,如果是外部表分区内数据不会被删除 hive> alter table aaa drop partition(statis_date='2011112' ) 3.给表增加列:新增的字段在最后面,对于原表中的数据,给新增的字段赋值为null. hive> alter table staff add columns ( id int comment'编号', name string comment'名字' ) 4.调整表中字段的位置:使用first ,after调增字段位置,比如讲grade调整到id后面呢 hive (staff)> alter table staff_hive change column grade grade int after id ; hive (staff)> select * from staff_hive; staff_hive.id staff_hive.grade staff_hive.name staff_hive.sex 1 NULL male NULL 2 NULL male NULL 3 NULL female NULL 4 NULL male NULL 注意:调整字段位置式,如grade即使不更改字段名,也要写上旧的字段名和字段类型。特别注意是这种修改只修改元数据信息,不会修改表中数据位置,如果 不对应的修改数据位置,则会出现匹配不上,null值的情况,这样修改表结构的一般适用于insert overwrite的情况。 5.修改表的属性 hive>alter table staff set tblproperties('aa'='张飞')