Hive_DLL简介

一、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数据删掉

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值