Hive
1.数据库的OLTP(联机事务处理)
- 针对数据的事务处理
- ACID原则(原子性,一致性,持久性,隔离性)
- 描述了数据库当前的状态
- 数据库的隔离级别
- 读未提取
- 读已提取
- 可重复读
- 序列化
OLAP(联机分析处理)
- 我们发现分析一些历史数据可以获取利益
- 我们会将以前的数据汇集到一起进行分析
- 于是我们需要建立数据仓库
2,数据仓库(Data Warehouse)
- 主要用来存放数据,而且这些数据不会被修改
- 数据的来源非常广泛
- 商品的订单信息
- 网站的访问日志
- 网站的问卷调查
- …
3.Hive的简介
-
非java编程者对HDFS的数据做mapreduce操作
-
原来做数据清洗或者数据分析,可以使用MapReduce
-
但是MapReduce需要有一定的java开发基础,但是数据的管理者可能是其他语言的程序员
-
这样就为现行的开发带来了不便利
-
通过研究绝大部分程序员都接触过sql语句
- 直接写sql语句,然后将sql语句解析成MapReduce
-
对数据的处理方式
-
admin,123456,18,180,shandong; zhangsan,123,16,160,shanxi; //首先将数据按照;分割 -->行 //然后将数据按照,分割 -->列 //将数据一一映射到表的列 //Hive不用存储任何实际数据,HDFS存储,Hive只需要存放映射关系
-
-
数据仓库是用来做查询分析的数据库,基本上不用来做 修改,删除操作
4,Hive原理和架构
客户端
- 向Hive发送请求
- DDL,DQL,DML整体仿写一套SQL语句
- Hive允许client连接的方式有很多种
- 常用的连接方式
- client–需要下载安装包
- JDBC/ODBC也可以连接到Hive
- 现在主流都在倡导第二种HiveServer2/beeline
- 做基于用户名和密码安全的一个校验
- Web Gui
- hive给我们提供了一套简单的web页面
- 我们可以通过这套web页面访问hive
- 页面太简陋了
MetaStore
- 一般需要借助其他的数据载体(数据库)
- 主要用于存放数据库的建表语句等信息
- 推荐使用MySql数据库存放数据
- 连接数据库需要提供:URL username password driver
Hive驱动
- 接受客户端的请求
- 里面主要包括(解释器,优化器,编译器,执行器)
- 然后对SQL语句执行如下操作
- 对客户端的SQL语句做语法语义的检测
- 将SQL语句转成逻辑执行的方案
- 对逻辑执行计划进行优化
- 将逻辑执行计划转换成物理执行计划
5.Hive的基本命令
数据库
- 显示数据库
- show databases;
- 创建数据库
- create database if not exists sxt;
- 创建数据库的时候会在配置的HDFs目录下新增一个同名文件夹
- create database if not exists is locatin ‘/shsxt/ls’;
- 一般情况下都会进将库放在一起,除非某些位置已经存在了库的数据
- 使用和删除数据库
- user shsxt;
- drop database ls;
数据类型()
- primitive type
- 整型
- TINYINT(byte) SMALLINT(short) INT(int) BIGINT(Long)
- 浮点型
- double float
- 字符型
- string varchar char
- 布尔
- boolean
- 日期
- date timestamp
- 整型
- array_type
- array<data_type>
- map_type
- map<primitive_type,data_type>
- struct_type
- struct<col_name:value>
表
- 一般都是现有数据,然后才根据数据的存放格式创建对应的表
--创建表
create table person(
id int,
name string,
age int,
likes array<string>,
addrs map<string,string>
)
row format delimited fields terminated by ','
COLLECTION ITEMS TERMINATED by '-'
map keys terminated by ':'
lines terminated by '\n';
//将数据导入到表中(注意符号错误)
//从word拷贝出来的代码,先放在txt中初始化一下
LOAD DATA LOCAL INPATH '/root/person.txt' INTO TABLE person;
//覆盖--我是对的
LOAD DATA LOCAL INPATH '/root/person.txt' OVERWRITE INTO TABLE person;
select * from person;
select name,age,likes[0] from person;
select count(id) from person;
实例:person
1,zshang,18,game-girl-book,stu_addr:beijing-work_addr:shanghai
2,lishi,16,shop-boy-book,stu_addr:hunan-work_addr:shanghai
3,wang2mazi,20,fangniu-eat,stu_addr:shanghai-work_addr:tianjing
4,wang4mazi,21,fangniu-eat,s_addr:shanghai-w_addr:tianjing
首先一行就是一条记录
属性与属性之间用(,)分割,一行有5个属性
1 -->int
zshang -->string
18 -->int
game-girl-book -->string -->arary 用(-)分割
stu_addr:beijing-work_addr:shanghai --> map struct 都可以
实例:
{
"name": "songso