hive读时模式:
1.传统的关系型数据库在进行数据加载时,必须验证数据格式是否符合表字段定义,如果不符合,数据将无法插入
至数据库表中。这种模式称为“写时模式”。
2.hive中,数据加载过程采用“读时模式”,加载数据时不进行校验,读取数据时如果不合法的是NULL
Hive DDL数据定义语言:
1.创建数据库:
hive>create database myhive;
hive>create database if not exists myhive;
hive>show databases;
hive>show databases like '*t*'; //使用正则匹配
说明:hive为创建的数据库生成了相对应的目录(*.db),目录在{hive.metastore.warehouse.dir}属性下,
同时,数据库中的表将以目录中的子目录进行存储;default默认数据库除外!
a.自定义修改数据库存放位置,需单独指定(*.db)目录
hive> dfs -mkdir -p /user/hive/test;
hive> dfs -lsr /user;
自定义数据库路径需要指定数据库文件名 eg:/tesTabA 或 /tesTabA.db
hive (default)> create database tesTabA
> comment 'holds all finacial tables'
> location '/user/hive/test/tesTabA.db';
OK
创建文件夹.db:
hive> create database myhive3 location '/user/hive/myhive3.db';
hive> dfs -lsr /user;
lsr: DEPRECATED: Please use 'ls -R' instead.
drwxrwxrwx - hyxy supergroup 0 2018-08-08 09:15 /user/hive
drwxrwxrwx - hyxy supergroup 0 2018-08-08 09:15 /user/hive/myhive3.db
drwxrwxrwx - hyxy supergroup 0 2018-08-08 09:15 /user/hive/myhive3.db/tt3
drwxrwxrwx - hyxy supergroup 0 2018-08-08 09:13 /user/hive/tt
drwxrwxrwx - hyxy supergroup 0 2018-08-08 08:58 /user/hive/warehouse
b.对数据库可以增加描述信息:
hive>create database if not exists myhive4 comment '创建hive测试库';
hive>describe database myhive4 ;
OK
myhive4 创建hive测试库 hdfs://mycluster/user/hive/warehouse/myhive4.db hyxy USER
Time taken: 0.069 seconds, Fetched: 1 row(s)
1)在数据库下创建表
2)查询数据
c.对数据库添加属性信息:
hive>create database myhive5 with dbproperties ('name'='zhangsan','data'='2018-08-08');
hive>desc database extended myhive5;
d.使用数据库:
hive>use myhive1;
e.删除数据库:
hive>drop database if exists myhive5;
hive>drop database if exists myhive3 cascade;
说明:cascade表示级联关系;restrict表示限制约束(默认值);
2.修改数据库:
除数据库的属性以外,其他信息均不能修改:
hive>alter database myhive5 set dbproperties ('name'='hyxy','data'='2018-08-08');
hive>desc database extended myhive5;
3.创建表
a.创建表:
hive>create table student(sid int comment 'xuehao',name string comment 'mingzi')
comment 'student table' tblproperties ('name'='zhangsan','data'='2018-08-08') ;
hive>create table hive.student(sid int comment 'xuehao',name string comment 'mingzi')
comment 'student table' tblproperties ('name'='zhangsan','data'='2018-08-08') ;
注意:【增加tblproperties属性后, 插入数据会报错】
b.查看表描述:
hive>desc hive.student;
hive>desc extended student;
c.拷贝表模型,创建新的表(数据不拷贝):
hive> create table employee2 like employee;
hive> select * from employee2;
查询数据插入到表中:
hive> insert into employee2 select * from employee;
union查询:
hive>select eid from employee union select eid from employee2;
union all查询:
hive>select eid from employee union all select eid from employee2;
4.管理表:
默认创建的表均为管理表,表达形式{MySQL:hive:TBLS}表的TBL_TYPE字段显示为MANAGER_TABLE;
一般也把管理表称为“内部表”;
内部表特性: hdfs下 将数据move(移动)至{hive.metastore.warehouse.dir}目录相关database下;
local下 将数据copy(复制)至{hive.metastore.warehouse.dir}目录相关database下;
5.外部表:
hive (default)>create external table if not exists stocks (
> exchange1 string,
> symbol string,
> ymd string,
> price_open float,
> price_high float,
> price_low float,
> price_close float,
> volume int,
> price_adj_close float)
> ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
> LOCATION '/data/stocks';
$>hadoop fs -mkdir /data
$>hadoop fs -mkdir -R /data/stocks
$>hadoop fs -put /mnt/hgfs/2.安装环境/data/stocks/stocks.csv /data/stocks
hive>create external table if not exists stocks (exchange1 string,symbol string,ymd string,
price_open float,price_high float,price_low float,price_close float,volume int,price_adj_close float)
row format delimited fields terminated by ',' location '/data/stocks';
hive>select count(*) from stocks ;
会执行MR Job!!
------------------------------------------------------------------------------------------
删除外部表:
drop table stocks;
1)查看mysql元数据,无记录
2)hfds下查看外部表 ,原数据不会删除
$> hadoop fs -lsr /
lsr: DEPRECATED: Please use 'ls -R' instead.
drwxr-xr-x - hyxy supergroup 0 2019-05-30 10:54 /data/stocks
-rw-r--r-- 2 hyxy supergroup 1095 2019-05-30 10:54 /data/stocks/stocks111.csv
drwxr-xr-x - hyxy supergroup 0 2019-05-30 10:58 /user/hive/warehouse/stocksdb.db
drwxr-xr-x - hyxy supergroup 0 2019-05-30 10:58 /user/hive/warehouse/stocksdb.db/stocks
关于创建表的知识点
create external table if not exists employees3
like employees
location '/path/to/data';
1)如果create时不加external,那么创建的表employees3由源表employees来决定
eg:源表是[内部表],那么创建的新表也是【内部表】,如果源表是[外部表],那么创建的新表也是【外部表】
2)如果create时加external,代表创建的表是外部表,不管源表是内部表还是外部表,创建的表都是【外部表】