一、DDL(Data Defination Language)

描述Hive表数据的结构,create drop alter...

1、Hive怎样存放数据

(1)Hive的数据存放在HDFS之上

(2)Hive的元数据可以存放在RDBMS之上

 Hive数据抽象的结构:

hive建表默认格式 hive建表设置字段默认值_BigData

二、Database

存放数据在Table。

创建数据库:

create database hive;

hive建表默认格式 hive建表设置字段默认值_BigData_02

1、default是Hive中默认的数据库

2、数据库存放的位置

hdfs dfs -ls /user/hive/warehouse/<databasename>.db

hive建表默认格式 hive建表设置字段默认值_Hive_03

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;

如果存在,不报错,但什么都不处理

hive建表默认格式 hive建表设置字段默认值_Hive_04

(2)LOCATION

create database hive2 LOCATION '/HBinzData';

会在HDFS新建一个目录‘/HBinzData’,由于没有表,所以是空的

hive建表默认格式 hive建表设置字段默认值_hive_05

hive建表默认格式 hive建表设置字段默认值_hive建表默认格式_06

进入HBinzData数据库创建表b

use hive2;

create table b(id int);

hive建表默认格式 hive建表设置字段默认值_Hive_07

应征了Hive数据库抽象结构就是一个个文件夹的结构。

(3)WITH DBPROPERTIES(数据库键值对属性信息)

create database hive2_ruozedata comment 'this is ruozedata 03 test database' WITH DBPROPERTIES('creator'='HBinz','date'='2018-08-08');

hive建表默认格式 hive建表设置字段默认值_hive_08

extended可以看到键值对 

hive建表默认格式 hive建表设置字段默认值_Hive_09

(4)drop删除数据库

语法:

DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];

drop database hive2;非空不能删除。

hive建表默认格式 hive建表设置字段默认值_数据_10

hive建表默认格式 hive建表设置字段默认值_hive建表默认格式_11

注意:

可以使用cascade强制删除数据库而不提示非空,但不建议。drop database hive2 CASCADE;

熟悉一下Hive命令:

create alter drop show desc use

三、基本数据类型

1、基本数据类型:

int   bigint float double decimal 

boolean 

string

date/timestamp ....

2、分隔符

hive建表默认格式 hive建表设置字段默认值_hive_12

四、表

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' ;【字段之间的分隔符】

hive建表默认格式 hive建表设置字段默认值_数据_13

(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';

hive建表默认格式 hive建表设置字段默认值_BigData_14

(2)查询表结构

简单:

hive建表默认格式 hive建表设置字段默认值_BigData_15

详细:

desc formatted ruozedata_person;

hive建表默认格式 hive建表设置字段默认值_hive建表默认格式_16

Table Type:

InputFormat:输入的是Text文本

OutputFormat:输出的格式是key

Storage Desc Params:\t 用\t分割

(3)修改默认的表路径

找到Hive.wiki的Configuration.Properties目录。

hive建表默认格式 hive建表设置字段默认值_BigData_17

搜索/warehouse

hive建表默认格式 hive建表设置字段默认值_Hive_18

这里可以看到默认是指向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' ;

hive建表默认格式 hive建表设置字段默认值_数据_19

2、将txt数据导入到本地表

官方文档:

(1)找到DML

hive建表默认格式 hive建表设置字段默认值_BigData_20

(2)加载文件到table

hive建表默认格式 hive建表设置字段默认值_hive_21

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:追加

hive建表默认格式 hive建表设置字段默认值_Hive_22

成功。

(3)加载的原txt,会传一份在HDFS上

路径在location下:hdfs://192.168.137.131:9000/user/hive/warehouse/ruozedata_emp

hive建表默认格式 hive建表设置字段默认值_BigData_23

(4)数据已经加载到hive的表上了

hive建表默认格式 hive建表设置字段默认值_hive_24

(5)另一种创建表的形式AS

create table ruozedata_emp2 as select * from ruozedata_emp(推荐使用,因为可以通过sql语句来达到自定义数据)

hive建表默认格式 hive建表设置字段默认值_Hive_25

使用这种方法建表需要启动YARN

hive建表默认格式 hive建表设置字段默认值_数据_26

hive建表默认格式 hive建表设置字段默认值_数据_27

(6)单独拷贝表结构

create table ruozedate_emp3 like ruozedata_emp2;

只有表结构,没有拷贝数据

3、修改表

hive建表默认格式 hive建表设置字段默认值_BigData_28

(1)表名修改:

ALTER TABLE table_name RENAME TO new_table_name;

alter table ruozedate_emp3 rename to ruozedata_emp3;

hive建表默认格式 hive建表设置字段默认值_hive_29

4、删除表

drop table ruozedata_emp3;

hive建表默认格式 hive建表设置字段默认值_BigData_30

5、清空表数据

truncate table table_name

truncate table ruozedata_emp2;

hive建表默认格式 hive建表设置字段默认值_Hive_31

6、快速拿到创建表的语句

show create table ruozedata_emp;

hive建表默认格式 hive建表设置字段默认值_数据_32

总结:

常用的命令:

create alter drop show desc 

六、表类型

hive建表默认格式 hive建表设置字段默认值_hive建表默认格式_33

create table的时候表类型默认MANAGED_TABLE(内部表)

1、外部表

EXTERNAL:外部表

(1)创建一张内部表

create table ruozedata_emp_manager as select * from ruozedata_emp;

hive建表默认格式 hive建表设置字段默认值_数据_34

(2)进入mysql的HBinz001数据库找到tbls

select * from tbls \G

hive建表默认格式 hive建表设置字段默认值_hive_35

hive建表默认格式 hive建表设置字段默认值_数据_36

可以这么理解Hive:

mysql数据库 HBinz001下Hive数据库hive2_ruozedata.db下的table

(3)删除内部表

drop table ruozedata_emp_manager

hive建表默认格式 hive建表设置字段默认值_Hive_37

注意:

HDFS里面的表也同时删除了。

Mysql中的数据表也删除了。

hive建表默认格式 hive建表设置字段默认值_数据_38

总结:

内部表,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";

hive建表默认格式 hive建表设置字段默认值_Hive_39

创建成功,是空表。

我们把数据文本放到指向的目录hdfs://192.168.137.131:9000/ruozedata/external/emp

hive建表默认格式 hive建表设置字段默认值_Hive_40

马上自动从指向目录的文件导入数据到table

hive建表默认格式 hive建表设置字段默认值_BigData_41

(5)删除外部表

drop table ruozedata_emp_external;

hive建表默认格式 hive建表设置字段默认值_BigData_42

数据还存在

但是meta已经删除了

hive建表默认格式 hive建表设置字段默认值_数据_43

总结:

删除外部表,仅删除meta,保留HDFS。

七、DML

1、语法

hive建表默认格式 hive建表设置字段默认值_数据_44

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;

hive建表默认格式 hive建表设置字段默认值_Hive_45

4、无法通过指定字段追加

因为表结构跟查询出来的字段结构不一致

hive建表默认格式 hive建表设置字段默认值_数据_46

5、如果字段位置错了会导致数据错乱

需要重跑,但是需要满足幂等的条件!!!

6、把查询结果写出来文件系统

hive建表默认格式 hive建表设置字段默认值_hive建表默认格式_47