一、数据仓库
1、数据仓库基本概念
概念:data Warehouse 简称数仓,DW,是一个用于存储、分析、报告的数据系统。目的是构建面向分析的集成化数据环境,分析结果为企业提供决策支持(decision support)。本身不“生产”数据、不需要“消费”数据。
为何而来:分析数据,为了更好的进行各种规模的数据分析,同时不影响OLTP系统运行
1)联机事务处理系统:
前台接收的用户数据可以立即传送到后台进行处理,并在很短时间内给出处理结果。(典型应用:关系型数据库-Mysql、SQL Server等,数据仓库也是),核心:面向业务,支持业务、支持事务,所有业务操作分读写两种,读的压力>写的压力
使用OLTP需要注意的:数据分析过程也会对数据进行读写操作,会让读取压力倍增
OLTP仅存储数周或数月的数据
数据分散在不同系统不同表中,字段类型属性不统一
2)数据仓库的 主要特征
面向主题:主题是一个抽象的概念,是较高层次上数据综合、归类并进行分析利用的抽象(数据分析干啥,比如公司可能需要分析哪个商品更受欢迎之类的)
集成性:主题相关的数据通常会分布在多个操作型系统中,彼此分散、独立、异构。需要集成到数仓主题下。需要把数据调整为单位归一等一致的数据。ETL:抽取、转换、加载=extract-transport-load
非易失性:也叫非易变性。数据仓库是分析数据的平台,而不是创造数据的平台。(数据进入数据仓库后,稳定且不会改变,数据反映的是一段相当长的时间内历史数据的内容,数据仓库中一般有大量的查询操作,但删除和修改操作很少)
时变性:数据仓库的数据需要随着时间更新,以适应决策的需要。是一个项目,更是一个过程。数据仓库包含各种粒度的历史数据。
3)数据仓库的主流语言
每一款编程语言只要具备读写数据、处理数据的能力,都可以用于数仓的开发。关键在于编程语言是否易学、好用、功能强大
4)SQL语言介绍:
结构化查询语言简称sql,用于数据库查询和程序设计语言,用于存取数据以及查询、更新和管理数据。
结构化数据:由二维表结构来逻辑表达和实现的数据,严格地遵循数据格式与长度规范,主要通过关系型数据库进行存储和管理
非结构化数据:相对的是不适于由数据库二维表来表现的非结构化数据,包含所有格式的办公文档、xml、HTML、各类报表、图片和音频、视频信息等。
5)SQl语言分类
2、apache hive入门
概念:hive是建立在Hadoop之上的开源数据仓库软件。可以将存储在Hadoop文件中的结构化、半结构化数据文件映射为一张数据库表,基于表提供了一种类似SQL的查询模型,称为Hive查询语言(HQL),用于访问和分析存储在Hadoop文件中的大型数据集。
核心:HQL转换为MapReduce程序,然后将程序提交到Hadoop集群执行
Hive由Facebook实现并开源。
为什么使用:学习成本高,实现复杂逻辑时开发难度大
优点:操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)
避免直接写MapReduce,减少开发人员的学习成本
支持自定义函数,功能扩展很方便
背靠Hadoop,擅长存储分析海量数据集
hive和Hadoop关系:Hive利用HDFS存储数据,利用MapReduce查询分析数据,
hive中能够写sql处理的前提是针对表,而不是针对文件,因此需要将文件和表之间的对应关系描述记录清楚。映射信息专业的叫法称之为元数据信息
1)sql语法解析、编译:
用户写完sql-hive对sql语法校验-根据元数据信息解读sql背后的含义-制定计划-转换MapReduce程序-执行结果封装-返回用户
hive中映射:文件和表之间的对应关系
hive担任的功能职责:sql语法解析编译成为MapReduce
2)hive架构和组件
组件:
用户接口:CLI-shell命令行、JDBC/ODBC、WebGUI-浏览器访问hive (用户通过写sql去使用hive)
元数据存储:通常是存储在关系数据库如mysql/derby中。Hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等
Driver驱动程序,包括语法解析器、计划编译器、优化器、执行器:完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS中,并在随后有执行引擎调用执行。
执行引擎:Hive本身不直接处理数据文件。而是通过执行引擎处理。当下Hive支持MapReduce、Tez、Spark3种执行引擎。(MR比较慢)
(hive完整架构图)
hive中管理元数据的叫MetaStore:元数据服务。对外暴露服务地址,让各种客户端通过连接Metasore服务,由metastore再去连接mysql数据库来存取元数据。(用户不需要sql密码啥的)
metastore配置方法:
3、Apache HIve 安装部署
前提Hadoop安装好,能正常运行。
1)需要在core.xml文件中整合
(也就是告知Hadoop,我在你们家住了)
2)安装MySQL
(windows上的和Linux无关,这里是指在Linux上安装)【基本还是windows上下载对应的软件包,然后通过中间软件传到Linux,再解压安装】
可能需要安装插件
初始化MySQL:
(复制密码时 不要复制空格)
ctrl+d结束MySQL服务
删除则百度嗷
3 )配置文件
(挑一台安装即可,因为它底层是Hadoop)
(site-xml文件内容百度,里面关于Hadoop、MySQL等密码,需要细心)
验证是否安装好
查看MySQL中创建的74张表
方法:虚拟机里面:使用 mysql -u root -p 密码 ; Hadoop进去之后输入:use hive; 切换数据库;输入show tables即可。
4)启动metastore服务
放前台开启:会一直开启,有必要可以ctrl+c关闭该服务。
放后台开启:nohup 空格 前台命令 &
后台启动后的运行位置:
jps检验,成功会多一个RunJar(结束进程则jps找到进程号,使用kill -9即可结束)
hive自带客户端
bin/hive、bin/beeline
bin/hive:第一代客户端,一是可用于交互或批处理模式运行hive查询;二十用于hive相关服务的启动,比如metastore服务
bin/beeline:是第二代客户端,是一个JDBC客户端,官方强烈推荐使用,性能更强,安全性提高。对接HiveServer2
第二代的大概流程:beeline CTL- HiveServer2-Metastore-metadata
注意:先启动metastore,在启动hiveserver2服务(也分前台启动和后台启动)
5)远程登录:
是在node3上登录node1的,通过jdbc,需要知道登哪台和对应端口号(! connect jdbc:hive2://node1:10000)
成功连接上:
(图形化操作的时候,一定要记得打开hive服务)
二、、Hive SQL语言:DDL建库、建表
1、建库
SQL中DDL(数据定义语言data definition language)语法的作用:对数据库内部的对象结构进行创建,删除,修改等的操作语言,这些数据库对象包括database、table等。
DDL核心语法由create、alter与drop三个所组成。DDL并不涉及表内部数据的操作。
默认的数据库叫做default,存储数据位置位于HDFS(Web UI)的/usr/hive/warehouse下,用户创建的数据库再/user/hive/warehouse/database_name.db下。
创建数据库:create database;
切换数据库:use database;
删除数据库:drop database;(前提是该数据库中没有表,是空的)
强制删除数据库:drop database cascade;(不管里面有没有表)
2、表和建表
表:标识(表名)+字段(列)+记录(行)+分隔符
1)数据类型:
原生数据类型:
复杂数据类型
最常用的数据类型是字符串String和数字类型Int
2)分隔符:
ROW FORMAT DELIMITED语法用于指定字段之间等相关的分隔符,这样Hive才能正确的读取解析数据。或者说只有分隔符指定正确,解析数据成功,我们才能在表中看到数据。
语法:
LazySimpleSerDe是hive默认的,包含4中子语法,分别用于指定字段之间、集合元素之间、map映射 kv之间、换行的分割符号。需要根据情况灵活使用(没有写则默认使用”\001“作为分隔符,vim编辑器下可以c+v/c+a即可输入“\001",显示A(Ascll码),分隔符不正确数据不会映射出来)
ROW FORMAT DELIMATED
[FIELDS TERMINATED BY char] 字段之间分隔符
[COLLECTION ITEMS TERMINATED BY char] 集合元素之间分隔符
[MAP KEYS TERMINATED BY char] Map映射kv之间分隔符
[LINES TERMINATED BY char] 行数据之间分隔符
然后将具体数据(这样可以避免使用insert一个一个添加)上传到对应HDFS中(WebUI 上传,还暂时没学load)。
注意:comment中的注释可能会导致查看的时候是乱码,需要在hadoop中,打开MySQL服务,找到存储的数据库(打开MySQL服务-查库),进入对应数据库:执行一下语句,并把表删除重建即可。
3)常用show语句:
显示所有数据库
show databases;
或 show schemas;
显示当前数据库所有表
use database_name;
show tables;
或者 SHOW TABLES [IN database_name];指定某个数据库
查询显示一张表的元数据信息
desc formatted table-name;