MySQL的DDL,DML,DTL与hive的DDL,DML,DTL的区别

对于一般的DDL,DML,DTL的概念和基本语句这里不做概述,以后我会专门梳理一下一套关于MySQL的DDL,DML,DTL。

我个人认为学习hive应该要具备一些基础的MySQL知识,比如简单的增删查改。当然也有人认为,直接从上手会更好一些。

因为hive是类sql语句,所以从sql语句的表面上来看。hive的DDL,DML和MySQL的DDL,DML没什么差别。而且功能也基本一致。

区别呢?

1,执行引擎不同:MySQL的执行引擎是InnoDB,MyISAM,MEMORY等。而hive的执行引擎主要是mapreduce,当然还有spark,tez等。

2,DML的区别:hive的主要是做查询数据离线分析,所以他的DML语句一般来说多使用查询,对于数据的,增加,修改,删除效率比较低的,为什么呢?因为在hive所存储的一张大表中(比如一亿条数据),在一亿条数据中如果说对其中某一条数据进行增删改的操作的话需要对整表进行扫苗,虽然也能实现,但是效率大打折扣。所以不建议在hive中对数据进行增删改的操作。那么MySQL主要做数据实时处理,对于数据的时效性要求较高,所以MySQL的DML主要侧重于数据的增删改,对于小规模数据也可以做查询。对于大数据概念下数据查询效率非常低。不适用于大数据环境下的查询分析。

3,DTL的区别:一般来说hive默认是不支持事物的,因为核心还是做查询分析,除非一些特定的业务场景,一般情况hive不使用DTL。而MySQL必须支持事物,对于MySQL数据的实时处理。在很多的业务场景下,都要求数据库的事务,比如支付功能就必须要事物支持。

4,DML的区别:对于MySQL和hive的创建表和数据库还是有很大区别。

区别在哪里?

看hive的建表语句

create table if not exists nginx(
ip STRING,
browser STRING
)
row format delimited fields terminated by '\t';

MySQL建表语句

CREATE TABLE IF NOT EXISTS nginx(
ip CHAR,
browser CHAR
)

在上面的语句中,我们分别在hive创建了nginx表在MySQL也创建啦一张nginx表。除了数据类型的区别外。

发现hive语句多了一条

row format delimited fields terminated by ‘\t’;
在hive里面这叫分隔符。而MySQL里面在创建表的时候就没分隔符概念。

那么为什么在hive里面会有一个这样的分隔符的概念呢?

我们发现创建的一张表是在HDFS上的,也就是说,hive中数据就是HDFS上的一个文本文件,包括自己创建的一张表,也会映射到HDFS上的一个文件,也就是说,我们在hive中创建一张表的过程,实际上就是在HDSF上创建文件的过程,那么为了数据的分析处理,我们必须为这一个文件里面的数据指定分隔符。当然从这个文件与hive里面表的映射关系信息是存储在hive的元数据库中的。

Hive表

建表语句

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT col_comment], …)]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], …)]
[CLUSTERED BY (col_name, col_name, …)
[SORTED BY (col_name [ASC|DESC], …)] INTO num_buckets BUCKETS]
[ROW FORMAT row_format]
[STORED AS file_format]
[LOCATION hdfs_path]
[TBLPROPERTIES (property_name=property_value, …)]
[AS select_statement]
为什么要建议由MySQL基础,如果有MySQL基础那么对于如上的建表语句。应该说瞟一眼就理解的,可能唯一不了解的就是后面的参数。

不过无所谓,看一眼就懂啦

(1)CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用 IF NOT EXISTS 选项来忽略这个异常。

(2)EXTERNAL 关键字可以让用户创建一个外部表,在建表的同时可以指定一个指向实 际数据的路径(LOCATION),在删除表的时候,内部表的元数据和数据会被一起删除,而外 部表只删除元数据,不删除数据。 

(3)COMMENT:为表和列添加注释。(4)PARTITIONED BY 创建分区表 

(5)CLUSTERED BY 创建分桶表 

(6)SORTED BY 不常用,对桶中的一个或多个列另外排序

(7)ROW FORMAT DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char] [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char] | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, …)] 用户在建表的时候可以自定义 SerDe 或者使用自带的 SerDe。如果没有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,将会使用自带的 SerDe。在建表的时候,用户还需 要为表指定列,用户在指定表的列的同时也会指定自定义的 SerDe,Hive 通过 SerDe 确定表 的具体的列的数据。SerDe 是 Serialize/Deserilize 的简称, hive 使用 Serde 进行行对象的序列与反序列化。

(8)STORED AS 指定存储文件类型 常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、RCFILE(列 式存储格式文件) 如果文件数据是纯文本,可以使用STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE。

(9)LOCATION :指定表在 HDFS 上的存储位置。

(10)AS:后跟查询语句,根据查询结果创建表。

(11)LIKE 允许用户复制现有的表结构,但是不复制数据。

1,管理表

hive默认创建表都是管理表,也叫内部表,hive会(或多或少)控制着数据的生命周期,hive默认把这些数据存储在默认的配置目录下(一般是hive.metastore.warehouse.dir)。

当我们删除一个管理表时,Hive也会删除这个表中数据。管理表不适合其他工具共享数据。
create table if not exists student(
id int, name string
)
row format delimited fields terminated by '\t'

2,外部表

因为是外部表所以hive不会认为完全拥有这张表的数据,删除该表并不会删除这张表数据。不过元数据信息会被删除。使用关键字external创建
create external table if not exists dept(
deptno int,
dname string,
loc int
)
row format delimited fields terminated by '\t';

3,内部表与外部表的转化

修改内部表 student2 为外部表
alter table student2 set tblproperties('EXTERNAL'='TRUE');
修改外部表 student2 为内部表
alter table student2 set tblproperties('EXTERNAL'='FALSE');