1.Hive DDL
1.1 database DDL
(1) 创建数据库
CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name //生产中if not exists都带上
[COMMENT database_comment] //可以增加注释
[LOCATION hdfs_path] //存的路径不写默认的就是/user/hive/warehouse
[WITH DBPROPERTIES (property_name=property_value, ...)]; //添加一些属性,key,value
练习:
create database if not exists hive2 comment 'this is test databaes' with DBPROPERTIES("cretor"='yunfei','teacher'='ruoze');
desc database extended hive2;
//不加这个extended看不到自己添加的属性
(2)删除数据库
use database hive2;
drop table xxx;
drop database hive2;
//这是生产中的正常操作,因为数据库下有表是不能删除的
强制的不学
(3)修改数据库
ALTER (DATABASE|SCHEMA) database_name SET DBPROPERTIES (property_name=property_value, ...); -- (Note: SCHEMA added in Hive 0.14.0)
ALTER (DATABASE|SCHEMA) database_name SET OWNER [USER|ROLE] user_or_role; -- (Note: Hive 0.13.0 and later; SCHEMA added in Hive 0.14.0)
ALTER (DATABASE|SCHEMA) database_name SET LOCATION hdfs_path; -- (Note: Hive 2.2.1, 2.4.0 and later)
hive> alter database hive2 set dbproperties('teacher'='jepson');
OK
Time taken: 0.076 seconds
hive> desc database extended hive2;
OK
hive2 this is test databaes hdfs://192.168.137.251:9000/user/hive/warehouse/hive2.db root USER {teacher=jepson, cretor=yunfei}
Time taken: 0.021 seconds, Fetched: 1 row(s)
1.2 table DDL
(1)创建表
create table hive2.ruozeperson (id int comment 'this is id',name string comment 'this is name') comment 'this is test table' row format delimited fields terminated by '\t';
create table person(id int,name string) comment 'this is a table' row format delimited fields terminated by '\t'
(2)查看表的详细信息
desc formatted ruozeperson;
(3)加载数据到表里面去
LOAD DATA LOCAL INPATH '/home/hadoop/data/emp.txt' OVERWRITE INTO TABLE ruozedata_emp;
local: 从本地文件系统加载数据到hive表
非local:从HDFS文件系统加载数据到hive表
LOAD DATA INPATH 'hdfs:192xxx/home/hadoop/data/emp.txt' OVERWRITE INTO TABLE ruozedata_emp;
OVERWRITE: 加载数据到表的时候数据的处理方式,覆盖
非OVERWRITE:追加
(4)第二种创建表的方式
create table emp_test as select * from emp;
这是将整个表复制了一遍
create table emp_test like emp;
这种只复制表的结构!!
(5)改表名
alter table emp_test3 rename to emp_test4;
(6)修改表的字段名和类型
alter table emp_test change column at empno string;
将at 列改为empno string类型
(7)快速查看创建表的信息
show create table emp;
俩个都是查看表的结构,但上面这个能快速看表是如何创建的。
desc formatted emp;
(8)第三种创建表的方式
create table ruozedata_emp4 like ruozedata_emp;
INSERT OVERWRITE TABLE ruozedata_emp4
select * FROM ruozedata_emp;
overwrite 是覆盖, to 是追加
(9)到处Hive处理的数据
这是导入到本地,导入HDFS换成HDFS的路径就好了
insert overwrite local directory '/home/hadoop/data' row format delimited fields terminated by '\t' select * from emp;
2.Hive的数据存储在哪?
分俩部分:
(1)真是数据存放在HDFS之上。
(2)元数据存放在RDBMS之上。
3.Hive的数据存储结构
(1)传统的关系型数据库,有database,但是Hive中的database,在HDFS之上,就是HDFS之上的一个顶层文件夹。
(2)传统的关系型数据库,有tables,Hive中的table就相当于第二层文件夹。
(3)Hive中还有一个更小的单位Partitions,一个表可以有多个partition,partition就是存放在文件夹之下。
(4)最后就是bucket,这是最底层的了,这就是具体的文件数据了。
4.Hive中常用的数据类型
(1)int bigint long float string double boolean(这个也不建议用,可以用01表示更加省字节) decimal(精度非常高的,很少用)
(2)常用的分隔符
行:\n
列:\001 tab ,空格,$$$ 就这些常用的
5.内外部表的不同
创建表默认使用的是MANAGED_TABLE:内部表
ruozedata_emp_managed
drop:hdfs+meta
EXTERNAL:外部表
create EXTERNAL table ruozedata_emp_external
(empno int, ename string, job string, mgr int, hiredate string, salary double, comm double, deptno int)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LOCATION "/ruozedata/external/emp" ;
drop: drop meta
内部表删除表会将hdfs上的数据和MySQL中的meta信息都删除,外部表则只删除meta信息。
6.操作出了问题,例如字段名字反了
只有重跑,别想着花里胡哨的回滚操作。
重跑:必须要要保证幂等性(就是执行n次结果是一样的!)