一、DDL: 全拼是Data Definition Language
Hive的DDL一般是指create delete drop alter关键字开头的操作。
官网的介绍https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL
先看看HIVE的一个数据结构图:
红色对应的全部都hdfs上的文件夹,数据库是文件夹,表是文件夹,分区是文件夹,
对应的数据呢,用绿色圈表示。其实我们说的DDL就是对数据库、表作各种创建、修改、删除等的操作。现从上到下依次介绍:
(一)、Database
1,hive其实就是HDFS上的一个文件夹
2,hive会默认自带一个default数据库,
该默认数据库存放位置:/user/hive/warehouse
该位置是由参数决定的:hive.metastore.warehouse.dir ,那该参数究竟是在哪查看呢?
其实,Hive所有参数的查询:
https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties
那么,我们在Hive里面如何查看指定配置参数呢?方法是用set, 语法:
set key; #比如set hive.metastore.warehouse.dir
而如果你要设置参数,就这样的语法: set key=value;
3,创建数据库的语法:
CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[WITH DBPROPERTIES (property_name=property_value, ...)];
比如 CREATE DATABASE IF NOT EXISTS d5_hive; #创建d5_hive数据库
查看d5_hive存放的路径,hadoop fs -ls /user/hive/warehouse
所以:非default的数据库的存放路径:${hive.metastore.warehouse.dir}/dbname.db
CREATE DATABASE IF NOT EXISTS d5_hive_2
COMMENT 'this is ruozedata d5'
WITH DBPROPERTIES ('creator'='ruoze', 'date'='20181020');
查看一下刚刚建的数据的信息,用 desc database extended d5_hive_2;
4、修改数据库
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)
5、删除数据库
DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];
比如:drop database d5_hive; # 抛出错误,提示指该数据库下不为空,它下面有一个或多个表。需要先删除了,才可以删数据库。
或可以用级联cascade: hibernate/jpa
什么是级联?就是:1对多的时候,你删除1的一端是否删除多的一端。
所以:drop database d5_hive cascade; #这样就完全删除数据库了。
注意:这个cascade,在生产上严禁使用。
(二)、表
create table xx(id int);
1、数据类型
数值类型:int、 bigint 、float 、double (数值类型只需记这4个就可以,其它基本很少用)
字符串: string <= date time (字符串类型的就用string就可以了,日期的话建议全部转换成string类型)
20181020
t:date time - string
where flag=true 0 # 布尔类型也尽量改为int 类型0和1
Hive构建在Hadoop之上
hive创建表,然后数据是存储在HDFS之上
文件:zhangsan,20,m,beijing
表: name age gender location
所以创建表的时候要指定分隔符(默认分隔符是\001 ^A),很少用
在工作中用得最多的是:空格、制表符(\t)
2、创建表
#行的格式 row format
row_format
: DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char]
[MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
[NULL DEFINED AS char] -- (Note: Available in Hive 0.13 and later)
| SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]
Row format delimited fields terminated by ‘\t’ #字段之间分隔以 ‘\t’, 即tab键分隔
Lines terminated by ‘\n’ # 行与行之间分隔以’\n’,即回车。这个可以不用。
现根据emp.txt文件建表
a.先create一个表
CREATE TABLE ruoze_emp (
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int
)
row format delimited fields terminated by ‘\t’ ; # 要注意 ’\t’ 是英文状态下的单引号
b. 用load 上载数据
load data local inpath '/home/hadoop/data/emp.txt' overwrite into table ruoze_emp;
c. 查询一下数据是否正常。
$$$$$
如果查询出来的数据是全部null,表示分隔符不对。要注意
3,查看表结构
desc xxx ; # 只能显示列的列明和类型
desc formatted ruoze_emp; # 可以查看该表的更详细的信息。这个是工作中常用的。
另:
a.如果只需要复制一个表结构,没有数据的,但是已经有表结构了。
比如要复制ruoze_emp2,这样:create table ruoze_emp2 like ruoze_emp;
b.如果是要复制表结构,也要复制数据到另一个新表,:
create table ruoze_emp3 as select * from ruoze_emp; # 这里需要跑mapreduce
4、修改表alter table
a.改表名
alter table ruoze_emp3 rename to ruoze_emp4; # 不仅改名,同时也把在hdfs的路径也改。
b.删表
drop table ruoze_emp4; # 不仅删表,同时也把在hdfs的路径也删掉。
(三)、内部表和外部表
MANAGED_TABLE –-内部表,被hive所管理的表叫内部表。
EXTERNAL_TABLE --外部表,路径可以随意设置的。
1、内部表
create table ruoze_emp_managed as select * from ruoze_emp;
以复制的形式创建了一张内部表,在HDFS上和在MySQL上看,都有数据
现在在hive删除表, drop table ruoze_emp_managed;
在hdfs 里面查一下是否有,hadoop fs -ls /user/hive/warehouse/d5_hive.db/ ,结果没了
然后在mysql里面查一下是否还有,select * from tbls \G; 结果也没有了。
2、外部表
创建外部表
CREATE EXTERNAL TABLE ruoze_emp_external (
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int
)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' #分隔符是’\t’
LOCATION '/ruoze_emp_external' #指定的路径
;
创建成果后,用desc formatted ruoze_emp_external; 查看一下该表的表结构,观察
Table Type所对应的是什么类型,EXTERNAL_TABLE表示是外部表。
此时该外部表ruoze_emp_external我没有数据的。
那这时可以导入数据。hadoop fs -put emp.txt /ruoze_emp_external/
那现在可以在hive查一下是否有数据 select * from ruoze_emp_external;
现在试试删除,在hive里面删除表drop table ruoze_emp_external; 操作后,hive已经没有该表了。那究竟hdfs还有没有呢?hdfs里面还有的。
mysql的数据呢?select * from tbls \G; 结果是没有了,被删了。
Hive做内部表的drop操作时,MySQL里面的元数据和hdfs的数据都会被删除掉;
而做外部表的drop操作时,只会把MySQL里面的元数据删除,不会把hdfs数据删掉