一、DDL(Data Defination Language)
描述Hive表数据的结构,create drop alter...
1、Hive怎样存放数据
(1)Hive的数据存放在HDFS之上
(2)Hive的元数据可以存放在RDBMS之上
Hive数据抽象的结构:
二、Database
存放数据在Table。
创建数据库:
create database hive;
1、default是Hive中默认的数据库
2、数据库存放的位置
hdfs dfs -ls /user/hive/warehouse/<databasename>.db
3、语法
CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[WITH DBPROPERTIES (property_name=property_value, ...)];
(1)NOT EXISTS,以后要习惯加上
create database IF NOT EXISTS hive;
如果存在,不报错,但什么都不处理
(2)LOCATION
create database hive2 LOCATION '/HBinzData';
会在HDFS新建一个目录‘/HBinzData’,由于没有表,所以是空的
进入HBinzData数据库创建表b
use hive2;
create table b(id int);
应征了Hive数据库抽象结构就是一个个文件夹的结构。
(3)WITH DBPROPERTIES(数据库键值对属性信息)
create database hive2_ruozedata comment 'this is ruozedata 03 test database' WITH DBPROPERTIES('creator'='HBinz','date'='2018-08-08');
extended可以看到键值对
(4)drop删除数据库
语法:
DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];
drop database hive2;非空不能删除。
注意:
可以使用cascade强制删除数据库而不提示非空,但不建议。drop database hive2 CASCADE;
熟悉一下Hive命令:
create alter drop show desc use
三、基本数据类型
1、基本数据类型:
int bigint float double decimal
boolean
string
date/timestamp ....
2、分隔符
四、表
1、语法
use ruozedata;【在ruozedata数据库】
CREATE TABLE ruozedata_person(id int comment ' this is id',name string comment 'this is name')【两个属性,一个id,一个name】comment 'this is ruozedata_person'【表的备注】ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t' ;【字段之间的分隔符】
(1)建表
CREATE TABLE ruozedata_person (id int comment 'this is id',name string comment 'this is name') comment 'this is ruozedata_person' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
(2)查询表结构
简单:
详细:
desc formatted ruozedata_person;
Table Type:
InputFormat:输入的是Text文本
OutputFormat:输出的格式是key
Storage Desc Params:\t 用\t分割
(3)修改默认的表路径
找到Hive.wiki的Configuration.Properties目录。
搜索/warehouse
这里可以看到默认是指向hdfs里面的/user/hive/warehouse,可以通过在hive-env.sh中添加hive.metastore.warehouse.dir参数,以及value的值来重新指向一个文件夹。但一般不修改。
五、实践
1、创建ruozedata_emp表
create table ruozedata_emp(empno int,ename string,job string,mgr int,hiredate string,salary double,comm double,deptno int)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t' ;
2、将txt数据导入到本地表
官方文档:
(1)找到DML
(2)加载文件到table
LOAD DATA [LOCAL] INPATH
'filepath'
[OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
LOAD DATA LOCAL INPATH '/opt/data/emp.txt'
OVERWRITE INTO TABLE ruozedata_emp
LOCAL:从本地文件系统加载数据到hive表
非LOCAL:从HDFS文件系统加载数据到hive表
OVERWRITE:加载数据到表的时候数据的处理方式,覆盖(覆盖是全覆盖,如果分区的话,只覆盖分区的文件)
非OVERWRITE:追加
成功。
(3)加载的原txt,会传一份在HDFS上
路径在location下:hdfs://192.168.137.131:9000/user/hive/warehouse/ruozedata_emp
(4)数据已经加载到hive的表上了
(5)另一种创建表的形式AS
create table ruozedata_emp2 as select * from ruozedata_emp(推荐使用,因为可以通过sql语句来达到自定义数据)
使用这种方法建表需要启动YARN
(6)单独拷贝表结构
create table ruozedate_emp3 like ruozedata_emp2;
只有表结构,没有拷贝数据
3、修改表
(1)表名修改:
ALTER TABLE table_name RENAME TO new_table_name;
alter table ruozedate_emp3 rename to ruozedata_emp3;
4、删除表
drop table ruozedata_emp3;
5、清空表数据
truncate table table_name
truncate table ruozedata_emp2;
6、快速拿到创建表的语句
show create table ruozedata_emp;
总结:
常用的命令:
create alter drop show desc
六、表类型
create table的时候表类型默认MANAGED_TABLE(内部表)
1、外部表
EXTERNAL:外部表
(1)创建一张内部表
create table ruozedata_emp_manager as select * from ruozedata_emp;
(2)进入mysql的HBinz001数据库找到tbls
select * from tbls \G
可以这么理解Hive:
mysql数据库 HBinz001下Hive数据库hive2_ruozedata.db下的table
(3)删除内部表
drop table ruozedata_emp_manager
注意:
HDFS里面的表也同时删除了。
Mysql中的数据表也删除了。
总结:
内部表,drop的时候,会把HDFS+meta数据全部删掉。
(4)外部表
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";
创建成功,是空表。
我们把数据文本放到指向的目录hdfs://192.168.137.131:9000/ruozedata/external/emp
马上自动从指向目录的文件导入数据到table
(5)删除外部表
drop table ruozedata_emp_external;
数据还存在
但是meta已经删除了
总结:
删除外部表,仅删除meta,保留HDFS。
七、DML
1、语法
2、插入数据(前提目标表已存在)
INSERT OVERWRITE TABLE tablename1 [IF NOT EXISTS]] select_statement1 FROM from_statement;
insert overwrite table ruozedata_emp4 select * from ruozedata_emp;
3、into,追加数据
INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement;
insert into ruozedata_emp4 select * from ruozedata_emp;
4、无法通过指定字段追加
因为表结构跟查询出来的字段结构不一致
5、如果字段位置错了会导致数据错乱
需要重跑,但是需要满足幂等的条件!!!
6、把查询结果写出来文件系统