今天是实习的第三天,学习了Hive的相关知识点,现把知识点总结如下:
一、数据仓库和数据库
1.数据仓库和数据库:操作型处理(数据库),叫联机事务处理OLTP(On-Line TransactionProcessing),也可以称面向用户交易的处理系统,它是针对具体业务在数据库联的日常操作,通常进行增删改查操作。用户较为关心操作的响应时间、数据的安全性、完整性和并发支持的用户数等问题。传统的数据库系统作为数据管理的主要手段,主要用于操作型处理。分析型处理(数据仓库),叫联机分析处理OLAP(On-Line Analytical Processing),也可以称为面专业分析人员进行数据分析,通常进行查询分析操作,一般针对某些主题的历史数据进行分析,支持管理策。
2.数仓的分层架构:数仓的分层架构可分为三层——源数据层、数据仓库层、数据应用层
3.ETL和ELT:数据仓库从各数据源获取数据及在数据仓库内的数据转换和流动都可以认为ETL(抽取Extract, 转化Transform , 装载Load)的过程。但是在实际操作中将数据加载到仓库却产生了两种不同做法:ETL和ELT。ETL: 先从数据源池中抽取数据,数据保存在临时暂存数据库中(ODS)。然后执行转换操作,将数据结构化并转换为适合目标数据仓库系统的形式,然后将结构化数据加载到数据仓库中进行分析。ELT: 从数据源中抽取后立即加载。没有专门的临时数据库(ODS),这意味着数据会立即加载单一的集中存储库中,数据在数据仓库系统中直接进行转换,然后进行分析
二、数据库操作
1.创建数据库(create database if not exists myhive;use myhive;),
2.查看数据库详细信息(desc database myhive;)
3.创建数据库并指定hdfs存储位置(create database myhive2 location '/myhive2';)
4.删除一个空数据库,如果数据库下面有数据表,那么就会报错(drop database myhive;)
5.强制删除数据库,包含数据库下面的表一起删除(drop database myhive2 cascade;)
三、数据表操作
1.表操作语法和数据类型:
1.1创建数据库语法:EXTERNAL,创建外部表、PARTITIONED BY, 分区表、CLUSTERED BY,分桶表、STORED AS,存储格式、 LOCATION,存储位置。
1.2.数据类型:
2.内部表和外部表区别:
2.1表分类:内部表(CREATE TABLE table_name ...)未被external关键字修饰的即是内部表,内部表又称管理表或者托管表。删除内部表:直接删除元数据和存储的业务数据
外部表(CREATE EXTERNAL TABLE table_name ...)被external关键字修饰的即是外部表,外部表又称非管理表或者非托管表。删除外部表:仅仅是删除元数据,存储的业务数据并不会被删除
3.内部表
创建内部表:create table [if not exists] 内部表名(字段名 字段类型 , ...)...;复制内部表:复制表结构: CREATE TABLE 表名 like 存在的表名;复制表结构和数据: CREATE TABLE 表名 as select语句;删除内部表: drop table 内部表名;查看表格式化信息:desc formatted 表名;truncate清空内部表数据: truncate table 内部表名;
4.外部表
创建内部表:create table [if not exists] 内部表名(字段名 字段类型 , ...)...;复制内部表:复制表结构: CREATE TABLE 表名 like 存在的表名;复制表结构和数据: CREATE TABLE 表名 as select语句;删除内部表: drop table 内部表名;查看表格式化信息:desc formatted 表名;truncate清空内部表数据: truncate table 内部表名;
5.查看/修改表
查看所有表:show tables;
查看建表语句:show create table 表名;
查看表结构信息:desc 表名;
查看表格式化信息:desc formatted 表名;
6. 映射表
修改表名:alter table 旧表名 rename to 新表名;
修改表路径:alter table 表名 set location 'hdfs中存储路径';
修改表属性:alter table 表名 set tblproperties ('属性名'='属性值');
7.数据加载和导出:
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE 表名;
INSERT INTO|OVERWRITE TABLE 表名 SELECT...
INSERT OVERWRITE [local] directory ‘path’ [format delimited] SELECT...;
hive -f/-e 执行语句或者脚本 > 文件名
8.分区表:在大数据中,最常用的一种思想就是分治,我们可以把大的文件切割划分成一个的小的文件,这样每次操作一个小的文件就会很容易了同样的道理,在hive当中也是支持这种思的,就是我们可以把大的数据,按照每天,或者每小时进行切分成一个个的小的文件,这样去操作小文件就会容易得多了
9. 分桶表:分桶和分区一样,也是一种通过改变表的存储模式,从而完成对表优化的一种调优方式但和分区不同,分区是将表拆分到不同的子文件夹中进行存储,而分桶是将表拆分到固定量的不同文件中进行存储
10.复杂类型操作:Hive支持的数据类型很多,除了基本的:int、string、varchar、timestamp等还有一些复杂的数据类型:• array集合/数组类型• mapkey-value映射类型• struct结构类型。
四、数据查询
1.基本查询查询语句的基本语法:
整体上和普通SQL差不多,部分有区别,如:CLUSTER BY、DISTRIBUTE BY、SORT BY等
SELECT [ALL | DISTINCT]select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY BYcol_list]
[HAVING where_condition]
[ORDER BY col_list]
[CLUSTER BY col_list | [DISTRIBUTE BY col_list] [SORT BY col_list]]
[LIMIT number]
2.RLIKE 正则匹配:正则表达式是一种规则集合,通过特定的规则字符描述,来判断字符串是否符合规则
3.UNION联合:UNION 用于将多个 SELECT 语句的结果组合成单个结果集。
每个 select 语句返回的列的数量和名称必须相同。否则,将引发架构错误。
4.Sampling采样:进行随机抽样,本质上就是用TABLESAMPLE函数基于随机分桶抽样:
SELECT ... FROM tbl TABLESAMPLE(BUCKET x OUT OF y ON(colname | rand()))
y表示将表数据随机划分成y份(y个桶)
x表示从y里面随机抽取x份数据作为取样
colname表示随机的依据基于某个列的值
rand()表示随机的依据基于整行
5.Virtual Columns 虚拟列:虚拟列是Hive内置的可以在查询语句中使用的特殊标记,可以查数据本身的详细参数。Hive目前可用3个虚拟列:
INPUT__FILE__NAME,显示数据行所在的具体文件
BLOCK__OFFSET__INSIDE__FILE,显示数据行所在文件的偏移量
ROW__OFFSET__INSIDE__BLOCK,显示数据所在HDFS块的偏移量
此虚拟列需要设置:SET hive.exec.rowoffset=true 才可使用
总结:不知不觉间已经 过去三天了,也学习很多知识点,充实了许多,再接再厉吧,期待着明天的到来。