1. Hive学习
Hive可以将大多数查询转化为MR任务,扩宽Hadoop的可扩展性,即Hive查询语句类似MR的一个高阶接口。
- 了解哪些情况不需要MR
本地模式下和一些简单的查询不用出发MR
Hive适合数据仓库应用,使用静态数据分析,高延迟,批处理,不支持事务。
- 数据库和数据仓库的区别
- 数据库 Database (Oracle, Mysql, PostgreSQL)主要用于事务处理
- 相对复杂的表格结构,存储结构相对紧致,少冗余数据。
- 读和写都有优化。相对简单的read/write query,单次作用于相对的少量数据
- 数据仓库 Datawarehouse (Amazon Redshift, Hive)主要用于数据分析。
- 相对简单的(Denormalized)表格结构,存储结构相对松散,多冗余数据。
- 一般只是读优化。相对复杂的read query,单次作用于相对大量的数据(历史数据)
- 事务是什么?
一系列子查询语句,数据库事务可以确保该事务范围内的所有操作都可以全部成功或者全部失败。如果事务失败,那么效果就和没有执行这些SQL一样,不会对数据库数据有任何改动。
数据库事务的四大特性
可见,数据库事务具有ACID这4个特性:
- A:Atomic,原子性,将所有SQL作为原子工作单元执行,要么全部执行,要么全部不执行;
- C:Consistent,一致性,事务完成后,所有数据的状态都是一致的,即A账户只要减去了100,B账户则必定加上了100;
- I:Isolation,隔离性,如果有多个事务并发执行,每个事务作出的修改必须与其他事务隔离;
- D:Duration,持久性,即事务完成后,对数据库数据的修改被持久化存储。
Hive不支持OLTP(联机事务处理),更像OLAP(联机分析技术)但目前没有联机。
- 了解OLTP和OLAP
类似上面数据库和数据仓库的区别。OLTP(on-line transaction processing)翻译为联机事务处理, OLAP(On-Line Analytical Processing)翻译为联机分析处理,从字面上来看OLTP是做事务处理,OLAP是做分析处理。从对数据库操作来看,OLTP主要是对数据的增删改,OLAP是对数据的查询。
- Hive和python可以交互吗?
好吧,需要借助shell
- Hive的组成部分
Hive介绍和原理分析
服务端
- Driver包括Complier(编译器)、Optimizer(优化器)和Executor(执行器),它的作用是将HiveQL(类SQL)语句进行解析、编译优化,生成执行计划,然后调用底层的MapReduce计算框架。
- Metastore组件:元数据服务组件,这个组件存取Hive的元数据,Hive的元数据存储在关系数据库里,Hive支持的关系数据库有Derby和Mysql。
- 元数据:hive表所对应的字段、属性还有表所对应存储的HDFS目录。
客户端:
- CLI:Command Line Interface,命令行接口。
- JDBC/ODBC:Hive架构的JDBC和ODBC接口是建立在Thrift客户端之上。
- WEBGUI:Hive客户端提供了一种通过网页的方式访问Hive所提供的服务。这个接口对应Hive的HWI组件(Hive Web Interface),使用前要启动HWI服务。
- Thrift [θrɪft] 服务:Thrift是Facebook开发的一个软件框架,它用来进行可扩展且跨语言的服务的开发,Hive集成了该服务,能让不同的编程语言调用Hive的接口。
- JDBC和ODBC是什么?
- JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,它是Java十三个规范之一。可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名。
- 放数据库互连(Open Database Connectivity,ODBC)是微软公司开放服务结构(WOSA,Windows Open Services Architecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口)。
JDBC和ODBC都是用来连接数据库的启动程序,JDBC和ODBC由于具有数据库独立性甚至平台无关性,因而对Internet上异构数据库的访问提供了很好的支持。
JDBC比ODBC更容易理解,JDBC数据库驱动程序是面向对象的,JDBC的移植性要比ODBC要好
2. sql学习
学习了建表,插入数据,批量插入,创建索引,唯一索引和构建触发器。
2.1 建表
--创建表,PRIMARY KEY指定主键
CREATE TABLE actor
(
actor_id smallint(5) NOT NULL DEFAULT 1,
first_name varchar(45) NOT NULL,
last_name varchar(45) NOT NULL,
last_update date NOT NULL,
PRIMARY KEY (actor_id));
--将检索出的表格插入新表中
CREATE TABLE actor_name
(first_name varchar(45) NOT NULL,
last_name varchar(45) NOT NULL);
INSERT INTO actor_name
(first_name, last_name)
SELECT first_name, last_name FROM actor;
2.2 插入数据
--批量插入数据
INSERT INTO actor(
actor_id, first_name, last_name, last_update)
VALUES(
1, 'PENELOPE', 'GUINESS', '2006-02-15 12:34:33'),
(
2, 'NICK', 'WAHLBERG', '2006-02-15 12:34:33');
--这种更加类似更新数据
INSERT OR IGNORE INTO actor
VALUES(3,'ED','CHASE','2006-02-15 12:34:33');
2.3 关于索引
CREATE UNIQUE INDEX uniq_idx_firstname ON actor(first_name);
CREATE INDEX idx_lastname ON actor(last_name);
ALTER TABLE actor ADD UNIQUE INDEX uniq_idx_firstname(first_name);
ALTER TABLE actor ADD INDEX idx_lastname(last_name);
2.4 视图
视图是张虚拟的表,只在使用它的时候查询,如果原始数据更新,那么再次执行视图出来的结果也会不一样。
视图的好处:重用sql语句,简化sql操作,保护数据,只使用表的组成部分而不是整张表,更改数据的格式和表示。
CREATE VIEW actor_name_view AS
SELECT first_name AS first_name_v,
last_name AS last_name_v FROM actor;
2.5 关于触发器
这个好难,需要一定时间来学会,这里就先放些示例吧。
--构造一个触发器audit_log,在向employees_test表中插入一条数据的时候,触发插入相关的数据到audit中。
CREATE TRIGGER audit_log AFTER INSERT ON employees_test
FOR EACH ROW
BEGIN
INSERT INTO audit VALUES(new.id, new.name);
END;