【Hive三】Hive理论
1. Hive基础
Hive基本概念
引入原因:
- – 对存在HDFS上的文件或HBase中的表进行查询时,是要手工写一堆MapReduce码
- – 对于统计任务,只能由动MapReduce的程序员才能搞定
- – 耗时耗力,更多精力没有有效的释放出来
Hive是什么
Hive基于一个统一的查询分析层,通过SQL语句的方式对HDFS上的数据进行查询、统计和分析
Hive是一个SQL解析引擎,将SQL语句转译成MR然后再Hadoop平台上运行,达到快速开发的目的
Hive中的表是 纯逻辑 表,就只是表的定义等,即表的元数据。本质就是Hadoop的目录/文件,达到了元数据与数据存储分离的目的
Hive本身不存储数据,它完全依赖HDFS和MapReduce。
Hive的内容是读多写少,不支持对数据的改写和删除(0.14版本之后,Hive支持更新删除功能,但需要手动进行配置 )
Hive中没有定义专门的数据格式,由用户指定,需要指定三个属性:
列分隔符
- \n****
行分隔符
- 空格、\t、\001
读取文件数据的方法
- TextFile、SequenceFile(二进制,是hadoop提供的一种二进制文件,<key,value>形式序列化到文件中,java writeable接口进行序列化和反序列化)、RCFile(是Hive专门推出的一种面向列的数据格式)
为什么选择Hive
因为简单!!
select word, count(*)
from (
select
explode(split(sentence, ' ')) as word
from article
) t
group by word
Hsql与传统sql区别
Hsql sql 数据存储 HDFS、 Hbase Local FS 数据格式 用户自定义 系统决定 数据更新 不支持(把之前的数据覆盖) 支持 索引 有(0.8版之后增加) 有 执行 MapReduce Executor 执行延迟 高 低 可扩展性 高(UDF、 UDAF,UDTF) 低 数据规模 大(数据大于TB) 小 数据检查 读时模式 写时模式 UDF,UDAF,UDTF
UDF:直接应用于select语句,通常查询的时候,需要对字段做一些格式化处理(大小写转换),特点:一进一出,1比1
UDAF:多对一场景,group by
UDTF:一对多场景
读时模式 vs 写时模式
读时模式:只有hive读的时候才会检查、解析字段和schema,优点:加载数据很迅速,因为在写的过程中是不需要解析数据
写时模式:缺点:写的慢,需要建立一些索引、压缩、数据一致性、字段检查等,优点:读的时候会得到优化
与传统关系型数据库特点比较
hive和关系数据库存储文件的系统不同,hive使用的是hadoop的HDFS(hadoop的分布式文件系统),关系数据库则是服务器本地的文件系统;
hive使用的计算模型是mapreduce,而关系数据库则是自己设计的计算模型
关系数据库都是为实时查询的业务进行设计的,而hive则是为海量数据做数据挖掘设计的,实时性很差
Hive很容易扩展自己的存储能力和计算能力,这个是继承hadoop的,而关系数据库在这个方面要比数据库差很多。
Hive数据管理
四种数据模型
- Table(默认表,也称内部表)
- External Table(外部表)
- Partition(分区表)
- Bucket(分桶表)
- Hive会针对某一个列进行桶组织,通常对列值做hash
- 优化查询、方便采样
Hive内部表和外部表
Hive的create创建表的时候,选择的创建方式:
- create table(内部表)
- create external table(外部表)
内部表 vs 外部表
- 差别:在对内部表操作的时候如果通过Hive对表进行删除,那么表结构和表中的数据也会删除,反之使用外部表的的话做删除操作时不会删除数据,只会删除表结构,
所以尽量使用外部表
- 差别:在对内部表操作的时候如果通过Hive对表进行删除,那么表结构和表中的数据也会删除,反之使用外部表的的话做删除操作时不会删除数据,只会删除表结构,
Hive数据类型
原生数据类型
- TINYINT
- SMALLINT
- INT
- BIGINT
- BOOLEAN
- FLOAT
- DOUBLE
- STRING
- BINARY(Hive 0.8.0以上才可用)
- TIMESTAMP(Hive 0.8.0以上才可用)
复合类型
- Arrays:ARRAY<data_type>
- Maps:MAP<primitive_type, data_type>
- Structs:STRUCT<col_name: data_type[COMMENT col_comment],……>
- Union:UNIONTYPE<data_type, data_type,……>
复合类型的作用
Hive Sql -- join in MR
Hive的优化
Map的优化:
– 作业会通过input的目录产生一个或者多个map任务。 set dfs.block.size(=128)
– Map越多越好吗?是不是保证每个map处理接近文件块的大小?
– 如何合并小文件,减少map数?
set mapred.max.split.size=100000000;
set mapred.min.split.size.per.node=100000000;
set mapred.min.split.size.per.rack=100000000;
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHive`InputFormat;
- – 如何适当的增加map数?
set mapred.map.tasks=10;
- – Map端聚合 hive.map.aggr=true ,Mr中的Combiners
Reduce 的优化
hive.exec.reducers.bytes.per.reducer;reduce任务处理的数据量
调整reduce的个数:
设置reduce处理的数据量
set mapred.reduce.tasks=10
select pt,count(1)
from popt_tbaccountcopy_mes
where pt = '2012-07-04' group by pt;
写成
select count(1)
from popt_tbaccountcopy_mes
where pt = '2012-07-04';
一个Reduce:
没有group by
order by(可以使用distribute by和sort by)
笛卡尔积
分区裁剪(partition)
- – Where中的分区条件,会提前生效,不必特意做子查询,直接Join和GroupBy
笛卡尔积
- – join的时候不加on条件或者无效的on条件,Hive只能使用1个reducer来完成笛卡尔积
Map join
/*+ MAPJOIN(tablelist) */,必须是小表,不要超过1G,或者50万条
假设有A表、B表,有A.join(B),如果A表示小表的话,可考虑是否将A表放入到内存中(小表尽量少于1G),
Union all
先做union all再做join或group by等操作可以有效减少MR过程,尽管是多个Select,最终只有一个mr,数据不去重
union操作不会产生重复记录但效率稍低一些,union all会产生重复数据但效率比union高一些
Multi-insert & multi-group by
– 从一份基础表中按照不同的维度,一次组合出不同的数据
– FROM from_statement
– INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1)]select_statement1 group by key1
– INSERT OVERWRITE TABLE tablename2 [PARTITION(partcol2=val2 )]select_statement2 group by key2
Automatic merge
– 当文件大小比阈值小时,hive会启动一个mr进行合并
– hive.merge.mapfiles = true 是否和并 Map 输出文件,默认为 True
– hive.merge.mapredfiles = false 是否合并 Reduce 输出文件,默认为 False
– hive.merge.size.per.task = 25610001000 合并文件的大小
Multi-Count Distinct
– 必须设置参数:set hive.groupby.skewindata=true;
– select dt, count(distinct uniq_id), count(distinct ip)
– from ods_log where dt=20170301 group by dt
Hive优化-- 大小表关联
原因
- Hive在进行join时,按照join的key进行分发,而在join左边的表的数据会首先读入内存,如果左边表的key相对分散,读入内存的数据会比较小,join任务执行会比较快;而如果左边的表key比较集中,而这张表的数据量很大,那么数据倾斜就会比较严重,而如果这张表是小表,则还是应该把这张表放在join左边。
思路
- 将key相对分散,并且数据量小的表放在join的左边,这样可以有效减少内存溢出错误发生的几率
- 使用map join让小的维度表先进内存。
方法
- Small_table join big_table
Hive优化-- 大大表关联
原因
- 日志中有一部分的userid是空或者是0的情况,导致在用user_id进行hash分桶的时候,会将日志中userid为0或者空的数据分到一起,导致了过大的斜率。
思路
- 把空值的key变成一个字符串加上随机数,把倾斜的数据分到不同的reduce上,由于null值关联不上,处理后并不影响最终结果。
方法
- on case when (x.uid = '-' or x.uid = '0‘ or x.uid is null) then concat('dp_hive_search',rand()) else x.uid end = f.user_id;
【Hive三】Hive理论的更多相关文章
- Hive(三)hive的高级操作
一.hive的各种join操作 语法结构:join_table:table_reference JOIN table_factor [join_condition]| table_reference ...
- Hive之 hive的三种使用方式(CLI、HWI、Thrift)
Hive有三种使用方式——CLI命令行,HWI(hie web interface)浏览器 以及 Thrift客户端连接方式. 1.hive 命令行模式 直接输入/hive/bin/hive的执行程 ...
- Hadoop Hive概念学习系列之hive三种方式区别和搭建、HiveServer2环境搭建、HWI环境搭建和beeline环境搭建(五)
说在前面的话 以下三种情况,最好是在3台集群里做,比如,master.slave1.slave2的master和slave1都安装了hive,将master作为服务端,将slave1作为服务端. 以 ...
- Hive三种不同的数据导出的方式
转自:http://blog.chinaunix.net/uid-27177626-id-4653808.html Hive三种不同的数据导出的方式,根据导出的地方不一样,将这些方法分为三类:(1)导 ...
- 三 Hive 数据处理 自定义函数UDF和Transform
三 Hive 自定义函数UDF和Transform 开篇提示: 快速链接beeline的方式: ./beeline -u jdbc:hive2://hadoop1:10000 -n hadoop 1 ...
- hive三种方式区别和搭建
Hive 中 metastore(元数据存储)的三种方式: a)内嵌 Derby 方式 b)Local 方式 c)Remote 方式 第一种方式 ...
- 【hive】——Hive四种数据导入方式
Hive的几种常见的数据导入方式这里介绍四种:(1).从本地文件系统中导入数据到Hive表:(2).从HDFS上导入数据到Hive表:(3).从别的表中查询出相应的数据并导入到Hive表中:(4).在 ...
- Hive记录-Hive on Spark环境部署
1.hive执行引擎 Hive默认使用MapReduce作为执行引擎,即Hive on mr.实际上,Hive还可以使用Tez和Spark作为其执行引擎,分别为Hive on Tez和Hive on ...
- Ambari配置Hive,Hive的使用
mysql安装,hive环境的搭建 ambari部署hadoop 博客大牛:董的博客 ambari使用 ambari官方文档 hadoop 2.0 详细配置教程 使用Ambari快速部署Hadoop大 ...
随机推荐
- Android笔记——Socket通信实现简单聊天室
两部分,客户端和服务端 ---------------------------------------------------------------- 客户端 1.为防止ANR异常,互联网连接可用 ...
- Scrapy框架Windows下安装
在windows下安装好Python3 后,安装Scrapy也有许多种方法,我这里采用pip 安装.前提您已经安装了pip 直接在cmd命令行中 pip install Scrapy building ...
- linux 问题总结
1.The program 'make' can be found in the following packages: 解决方法:sudo apt-get install build-essenti ...
- RabbitMQ 启动
1.使用Rabbit MQ 管理插件,可以更好的可视化方式查看Rabbit MQ 服务器实例的状态,你可以在命令行中使用下面的命令激活: C:\Program Files\RabbitMQ Serve ...
- Struts学习-Hibernate2
一. 1.配置 <!-- hibernate-core --> <dependency> <groupId>org.hibernate</groupId> ...
- hiredis
hiredis是redis开源库对外发布的客户端API包. 当redis-server配置启动后,可以通过hiredis操作redis资源. 主要分为: strings.hash.lists.sets ...
- java IO流 总结
[-] 1什么是IO 2数据流的基本概念 1 数据流 2 输入流Input Stream 3 输出流 数据流分类 3 标准IO 命令行参数 标准输入输出数据流 4javaIO层次体系结构 5 非流式 ...
- 2018 Multi-University Training Contest 4 Problem L. Graph Theory Homework 【YY】
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6343 Problem L. Graph Theory Homework Time Limit: 2000 ...
- 清除IE下input的叉叉
很多时候,我们在开发过程中,设计师会在输入框后加上定制的清除图标,但是在IE下有IE自带的清除图标,肯定是不美观的. <style> ::-ms-clear, ::-ms-reveal{d ...
- Selenium应用代码(读取mysql表数据登录)
1. 封装链接数据库的类: import java.sql.ResultSet; import java.sql.Connection; import java.sql.DriverManager; ...