Hive(五)hive的高级应用
一、视图
视图:享用基本表的数据,不会生成另外一份数据
创建视图:
create view view_name as select * from carss;
create view carss_view as select * from carss limit 500;
查看视图:
desc view_name
desc carss_view
删除视图:
drop view view_name
drop view carss_view
使用视图:
create view sogou_view as select * from sogou_table where rank > 3 ;
select count(distinct uid) from sogou_view;
二、hive特殊分隔符处理
补充: hive 读取数据的机制:
(1) 首先用 InputFormat<默认是: org.apache.hadoop.mapred.TextInputFormat >的一个具体实 现类读入文件数据,返回一条一条的记录(可以是行,或者是你逻辑中的“行”)
(2) 然后利用 SerDe<默认: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe>的一个具体 实现类,对上面返回的一条一条的记录进行字段切割
Hive 对文件中字段的分隔符默认情况下只支持单字节分隔符,如果数据文件中的分隔符是多字符的,如下所示:
01||huangbo
02||xuzheng
03||wangbaoqiang
可用以下方式处理:
1、使用 RegexSerDe 通过正则表达式来抽取字段
create table t_bi_reg(id string,name string)
row format serde 'org.apache.hadoop.hive.serde2.RegexSerDe'
with serdeproperties('input.regex'='(.*)\\|\\|(.*)','output.format.string'='%1$s %2$s')               如果三个字段,再加上一个%3$s
stored as textfile;
hive>load data local inpath '/root/hivedata/bi.dat' into table t_bi_reg;
hive>select * from t_bi_reg;
2、通过自定义 InputFormat 解决特殊分隔符问题
其原理是在 inputformat 读取行的时候将数据中的“多字节分隔符”替换为 hive 默认的 分隔符( ctrl+A 亦即 \001)或用于替代的单字符分隔符,以便 hive 在 serde 操作时按照 默认的单字节分隔符进行字段抽取
修改com.ghgj.hive.delimit2. BiDelimiterInp
      com.ghgj.hive.delimit2. BiRecordReader
把自定义的类(修改的源代码)打包 上传包 在mv xx.jar apps/apa...../lib/ 重启hive , 建表时引用自己定义的类 (复杂查询时还要 add jar 包)

三、数据倾斜
1、什么是数据倾斜
由于数据分布不均匀,造成数据大量的集中到一点,造成数据热点。
2、 Hadoop 框架的特性
A、 不怕数据大,怕数据倾斜。
   B、 Jobs 数比较多的作业运行效率相对比较低,如子查询比较多。
   C、 sum,count,max,min 等聚集函数,不会有数据倾斜问题
3、 容易数据倾斜情况
   A、 group by 不和聚集函数搭配使用的时候。
   B、 count(distinct ),在数据量大的情况下,容易数据倾斜,因为 count(distinct)是按 group by 字段分组,按 distinct 字段排序。
   C、 小表关联超大表

4、 产生数据倾斜的原因:
A: key 分布不均匀
B:业务数据本身的特性
C:建表考虑不周全
D:某些 HQL 语句本身就存在数据倾斜
5、 主要表现:
任务进度长时间维持在 99%或者 100%的附近, 查看任务监控页面,发现只有少量 reduce子任务未完成, 因为其处理的数据量和其他的 reduce 差异过大。
单一 reduce 处理的记录数和平均记录数相差太大,通常达到好几倍之多,最长时间远大 于平均时长。(耗时长)
6、业务场景
A: 空值产生的数据倾斜
场景说明: 在日志中,常会有信息丢失的问题, 比如日志中的 user_id,如果取其中的 user_id 和用户表中的 user_id 相关联,就会碰到数据倾斜的问题。
解决方案 1: user_id 为空的不参与关联
select * from log a join user b on a.user_id is not null and a.user_id = b.user_id union all
select * from log c where c.user_id is null;
解决方案 2: 赋予空值新的 key 值
select * from log a left outer join user b on case when a.user_id is null then
concat(‘hive’,rand()) else a.user_id end = b.user_id
总结: 方法 2 比方法 1 效率更好, 不但 IO 少了,而且作业数也少了,方案 1 中, log 表 读了两次, jobs 肯定是 2,而方案 2 是 1。 这个优化适合无效 id(比如-99, ’’, null)产 生的数据倾斜, 把空值的 key 变成一个字符串加上一个随机数,就能把造成数据倾斜的 数据分到不同的 reduce 上解决数据倾斜的问题。
B:不同数据类型关联产生数据倾斜
场景说明: 用户表中 user_id 字段为 int, log 表中 user_id 为既有 string 也有 int 的类型, 当按照两个表的 user_id 进行 join 操作的时候,默认的 hash 操作会按照 int 类型的 id 进 行分配,这样就会导致所有的 string 类型的 id 就被分到同一个 reducer 当中
解决方案: 把数字类型 id 转换成 string 类型的 id
select * from user a left outer join log b on b.user_id = cast(a.user_id as string)

Hive(五)hive的高级应用的更多相关文章
- Hive(五):hive与hbase整合
		
配置 hive 与 hbase 整合的目的是利用 HQL 语法实现对 hbase 数据库的增删改查操作,基本原理就是利用两者本身对外的API接口互相进行通信,两者通信主要是依靠hive_hbase-h ...
 - Hadoop生态圈-hive五种数据格式比较
		
Hadoop生态圈-hive五种数据格式比较 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
 - Hadoop 部署之 Hive (五)
		
目录 一.Hive 简介 1.什么是 Hive 2.为什么使用 Hive 3.Hive 的特点 4.Hive 的架构 二.Hive 安装 1.MySQL 安装(datanode01) 2.MySQL ...
 - Hive 文件格式 & Hive操作(外部表、内部表、区、桶、视图、索引、join用法、内置操作符与函数、复合类型、用户自定义函数UDF、查询优化和权限控制)
		
本博文的主要内容如下: Hive文件存储格式 Hive 操作之表操作:创建外.内部表 Hive操作之表操作:表查询 Hive操作之表操作:数据加载 Hive操作之表操作:插入单表.插入多表 Hive语 ...
 - 【hive】——Hive四种数据导入方式
		
Hive的几种常见的数据导入方式这里介绍四种:(1).从本地文件系统中导入数据到Hive表:(2).从HDFS上导入数据到Hive表:(3).从别的表中查询出相应的数据并导入到Hive表中:(4).在 ...
 - C#可扩展编程之MEF学习笔记(五):MEF高级进阶
		
好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...
 - ubuntu下搭建hive(包括hive的web接口)记录
		
Hive版本 0.12.0(独立模式) Hadoop版本 1.12.1 Ubuntu 版本 12.10 今天试着搭建了hive,差点迷失在了网上各种资料中,现在把我的经验分享给大家,亲手实践过,但未必 ...
 - [Hive - LanguageManual] Hive Concurrency Model (待)
		
Hive Concurrency Model Hive Concurrency Model Use Cases Turn Off Concurrency Debugging Configuration ...
 - Shell脚本运行hive语句 | hive以日期建立分区表 | linux schedule程序 | sed替换文件字符串 | shell推断hdfs文件文件夹是否存在
		
#!/bin/bash source /etc/profile; ################################################## # Author: ouyang ...
 - Hive记录-Hive介绍(转载)
		
1.Hive是什么? Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的 SQL 查询功能,将类 SQL 语句转换为 MapReduce 任务执 ...
 
随机推荐
- spark读取外部配置文件的方法
			
spark读取外部配置文件的方法 spark-submit --files /tmp/fileName /tmp/test.jar 使用spark提交时使用--files参数,spark会将将本地的 ...
 - css各种鼠标手型集合
			
比较齐全的鼠标手型css在国内的网站上是没搜到这么全的比如说哪个禁止的手型:鼠标往下移动即可看到效果: html代码如下: <h1>Cursors</h1> <div c ...
 - openvpn部署
			
原文发表于cu:2016-03-29 参考文档: 安装:http://qicheng0211.blog.51cto.com/3958621/1575273 安装:http://www.ipython. ...
 - Linux 配置网络连接
			
在VMware里,依次点击”编辑“ - ”虚拟网络编辑器“,如下图,我选择的是NAT模式: 在这个界面接着点"NAT设置",查看虚拟机的网关,这个网关在第三步要用.我这里的网关是1 ...
 - rhel6 mysql skip-grant-tables 添加用户报错 ERROR 1290
			
不小心把数据库密码忘掉了, 这个时候我们只需要在数据库的配置文件里面添加 skip-grant-tables 然后重新启动服务,再登录数据库就不要我们输入密码了 这个时候我成功登录数据,可是不小心又把 ...
 - log4j 配置使用
			
使用log4j来管理日志信息,非常方便,下面简单介绍一下整个使用流程: 1.创建简单java项目 2.在类路径下新建log4j.properties文件 3.配置log4j.properties文件 ...
 - 结对编程学习fault、error、failure三种状态
			
点滴成就 学习时间 新编写代码行数 博客量(篇) 学习知识点 第一周 10小时 0 0 了解软件工程 第二周 10小时 0 1 项目开题 第三周 15小时 0 1 开通博客.开展项目调查 第四周 20 ...
 - linux设置时区和自动同步时间
			
1.设置时区 编辑 /etc/sysconfig/clock 修改 ZONE="Asia/Shanghai" 然后 cp /usr/share/zoneinfo/Asia/Sh ...
 - UserAgent 设置   php 抓取网页
			
转载:http://www.webkaka.com/tutorial/php/2013/111846/ hp抓取网页,可谓轻而易举,几行代码就可以搞定.不过,如果你有所疏忽,程序写得不够严密,就会出现 ...
 - Git回滚merge操作
			
执行完merge操作后,没有修改代码 1.命令 ⑴ git reflog 查看merge操作的上一个提交记录的版本号 ⑵ git reset –hard 版本号 这样可以回滚到merge之前的状态 2 ...