首先介绍下什么是HIve?
1.基于Hadoop的开源的数据仓库工具,用于处理海量海量结构化数据。
2.Hive把HDFS中的结构化的数据文件映射成数据表。
3.Hive通过HiveSQL进行解析和转换,最终映射成一系列在hadoop上运行的mapreduce任务,通过执行这些任务完成分析和处理。
4.HiveSql和Mysql一样,都遵循着SQL的标准,因此它们很多语句都是一样的。

一、先复习下SQL的语句的结构

SELECT  *     (必须)
FROM            表(数据源)
WHERE           条件
GROUP BY        字段
HAVING          条件
ORDER BY        字段(排序 默认 ASC)
LIMIT           限制数据条数

注意:sql对大小写一般不敏感,一般命令用大写,表名,字段用小写

二、 SQL语句的执行顺序

第一步:确定数据源
FROM
JOIN
ON
第二步:过滤数据
WHERE
GROUP BY (开始使用SELECT 中的别名,后面的语句中都可以使用)
avg,sum.......
HAVING
第三步:查询数据
SELECT
第四步:显示数据
DISTINCT
ORDER BY
LIMIT

三、优化技巧

技巧一:列裁剪和分区裁剪
1.列裁剪:
列裁剪就是在查询时只读取需要的列。当列很多或者数据量
很大时,如果select 所有的列或者不指定分区,导致的全表
扫描和全分区扫描效率都很低。Hive中与列裁剪优化相关的
配置项是hive.optimize.cp,默认是true
2.分区裁剪:
分区裁剪就是在查询时只读需要的分区。Hive中与分区裁剪
优化相关的则是hive.optimize.pruner,默认是true。

技巧二:排序技巧 sort by 代替order by

HiveSQL中的order by与其他SQL语言中的功能一样,就是
将结果按某个字段全局排序,这会导致所有map端数据都进
入一个reduce中,在数据量大时可能会长时间计算不完。
如果使用sort by,那么就会视情况启动多个reducer进行排
序,并且保证每个reducer内局部有序。为了控制map端数
据分配到reduce的key,往往还要配合distribute by一同使
用。如果不加distribute by的话,map端数据就会随机分配
给reducer。

-- 未优化写法
select a,b,c
from table
where xxx
order by a
limit 10;
-- 优化写法
select a,b,c
from table
where xxx
distribute by a
sort by a
limit 10;

技巧三:去重技巧 --用group by 来代替distinct

-- 取出user_trade表中全部支付用户
-- 原有写法
SELECT distinct user_name
FROM user_trade
WHERE dt>'0';
--测试时长 43 s
-- 优化写法
SELECT user_name
FROM user_trade
WHERE dt>'0'
GROUP BY user_name;
--测试时长 29 s

注意:在极大的数据量(且很多重复值)时,可以先group by去重,再count()计数,效率高于直接count(distinct **)

技巧四 :聚合技巧–grouping sets 、cube、rollup
1.grouping sets
想知道用户的性别分布、城市分布、等级分布?
通常写法:

性别分布
select sex,
count(distinct user_id)
from user_info
group by sex;
城市分布
select city,
count(distinct user_id)
from user_info
group by city;
等级分布
select level,
count(distinct user_id)
from user_info
group by level;

通常要写三词sql语句
优化之后

select sex,city,levelcount(distinct user_id)
from user_info
group by sex,city,level
grouping sets (sex,city,level)

注意:grouping sets 指定分组的维度 聚合结果均在同一列,分类字段用不同列来区分
2.cube :根据group by维度的所有组合进行聚合。

-- 性别、城市、等级的各种组合的用户分布
SELECT sex,city,level,count(distinct user_id)
FROM user_info
GROUP BY sex,city,level
GROUPING SETS (sex,city,level,(sex,city),
(sex,level),(city,level),(sex,city,level));

优化之后:

select sexcity,level,count(distinct user_id)
FROM user_info
GROUP BY sex,city,level
with cube;

3.rollup:以最左侧的维度为主,进行层级聚合,是cube的子集。

计算出,每个月的支付金额,以及每年的总支付金额
一般写法:

SELECT a.dt,sum(a.year_amount),sum(a.month_amount)
FROM(SELECT substr(dt,1,4) as dt,sum(pay_amount) year_amount,0 as month_amountFROM user_tradeWHERE dt>'0'GROUP BY substr(dt,1,4)UNION ALLSELECT substr(dt,1,7) as dt,0 as year_amount,sum(pay_amount) as month_amountFROM user_tradeWHERE dt>'0'GROUP BY substr(dt,1,7))a
GROUP BY a.dt;

优化写法

SELECT year(dt) as year,month(dt) as month,sum(pay_amount)
FROM user_trade
WHERE dt>'0'
GROUP BY year(dt),month(dt)
with rollup;

技巧五 换个思路解题
条条大路通罗马,写SQL亦是如此,能达到同样效果的SQL有很多种,要学会思路转换,灵活应用。

--在2017年和2018年都购买的用户--
SELECT a.user_name
FROM(SELECT distinct user_nameFROM user_tradeWHERE year(dt)=2017)aJOIN(SELECT distinct user_nameFROM user_tradeWHERE year(dt)=2018)b on
a.user_name=b.user_name;

– 方式一

SELECT a.user_name
FROM(SELECT user_name,count(distinct year(dt)) as
year_numFROM user_tradeWHERE year(dt) in (2017,2018)GROUP BY user_name)aWHERE a.year_num=2;

– 方式二

SELECT user_name,count(distinct year(dt)) as year_num
FROM user_trade
WHERE year(dt) in (2017,2018)
GROUP BY user_name
having count(distinct year(dt))=2;

技巧六:union all时可以开启并发执行
Hive中互相没有依赖关系的job间是可以并行执行的,最典型的就是多个子查询union all。在集群资源相对充足的情况下,可以开启并行执行。
参数设置:set hive.exec.parallel=true;
– 每个用户的支付和退款金额汇总

SELECT a.user_name,sum(a.pay_amount),sum(a.refund_amount)
FROM( SELECT user_name,sum(pay_amount) as pay_amount,0 as refund_amountFROM user_tradeWHERE dt>'0'GROUP BY user_nameUNION ALLSELECT user_name,0 as pay_amount,sum(refund_amount) as
refund_amountFROM user_refundWHERE dt>'0'GROUP BY user_name)a
GROUP BY a.user_name;

时间对比:
未开并发执行 103 s
开启并发执行 64 s

技巧七 表连接优化

1.小表在前,大表在后
Hive假定查询中最后的一个表是大表,它会将其它表缓存起来,然后扫描最后那个表。

2.使用相同的连接键
当对3个或者更多个表进行join连接时,如果每个on子句都使用相同的连接键的话,那么只会产生一个MapReduce job。
3.尽早的过滤数据
减少每个阶段的数据量,对于分区表要加分区,同时只选择需要使用到的字段。

技巧八 遵循严格模式

所谓严格模式,就是强制不允许用户执行3种有风险的HiveSQL语句,一旦执行会直接报错。
1.查询分区表时不限定分区列的语句。
2.两表join产生了笛卡尔积的语句。
3.要order by来排序但没有指定limit的语句。
要开启严格模式,需要将参数hive.mapred.mode设为strict。

Hivesql常用优化技巧相关推荐

  1. vue seo关键词设置_网站SEO常用优化技巧

    SEO(Search Engine Optimization)搜索引擎优化,简单来说,就是通过技术手段,帮助我们的网站上首页.不同的搜索引擎,排名算法也不尽相同,导致了各项参数的权重比值也就不一样,但 ...

  2. HiveSQL常用优化方法全面总结

    转载自  HiveSQL常用优化方法全面总结 Hive作为大数据领域常用的数据仓库组件,在平时设计和查询时要特别注意效率.影响Hive效率的几乎从不是数据量过大,而是数据倾斜.数据冗余.job或I/O ...

  3. Android群英传知识点回顾——第四章:ListView常用优化技巧

    Android群英传知识点回顾--第四章:ListView常用优化技巧 知识点目录 4.1 ListView常用优化技巧 4.1.1 使用ViewHolder模式提高效率 4.1.2 设置项目间分割线 ...

  4. SQL语句常用优化技巧

    2019独角兽企业重金招聘Python工程师标准>>> 1.避免在where子句中使用 is null 或 is not null 对字段进行判断. 如: select id fro ...

  5. ListView 常用优化技巧

    ListView的基本用法相信大多数读者都已经能够非常熟练的使用了,下面我们就着重来学习一下使用ListView的技巧. ●  使用ViewHolder模式提高效率 ViewHolder模式是提高Li ...

  6. 常用的7个SQl优化技巧

    作为程序员经常和数据库打交道的时候还是非常频繁的,掌握住一些Sql的优化技巧还是非常有必要的.下面列出一些常用的SQl优化技巧,感兴趣的朋友可以了解一下. 1.注意通配符中Like的使用 以下写法会造 ...

  7. mysql 判断字段为null表示 false 其它为true_日拱一卒,MySQL数据库 常用SQL优化技巧 十一式...

    本文中所提到的SQL优化技巧均是基于Mysql 索引 BTree类型 .将从以下几个方面介绍常用的SQL优化技巧: 避免在 WHERE 子句中使用 != 或 <> 操作符. 避免在 WHE ...

  8. mysql like in 数组_Web前端学习教程之常用的MySQL优化技巧

    想要成为一个高薪Web前端工程师,除了需要了解前端三要素以及常用的框架外,数据库知识同样不可忽视.目前市场上比较流行的数据库有MySQL.Oracle.Redis,今天千锋郑州老师就给大家分享一些常用 ...

  9. 常用Unity的优化技巧集锦

    Unity性能优化是面试的时候经常被问道的一些内容,今天给大家分享一些常用的Unity的优化技巧和思路,方便大家遇到问题时候参考与学习. 包体大小优化 游戏的安装包体大小对于游戏开发而言非常重要,因为 ...

  10. 常用博客SEO优化技巧

    博客的SEO优化其实并不是特别重要,因为博客的关键在于内容,内容为王,有了优秀而独特的内容,就很容易取得较好的排名.当然,使用一些常用的 SEO优化技巧也可以更好的改善排名.这里我以Z-Blog为例介 ...

最新文章

  1. Pascal 错误代码及含义
  2. java web里实现 mvc_MVC模式在Java Web应用程序中的实现
  3. asp.net Web API 身份验证 不记名令牌验证 Bearer Token Authentication 简单实现
  4. SQL链表查询 数据库为空
  5. zabbix的日常监控-自动发现端口并监测(服务器开启的所有端口或监控指定端口)(十三)...
  6. python lamda函数_python 用lambda函数替换for循环的方法
  7. 你可以通过这13种方法帮助Linux发展
  8. .NETStandard FreeSql v0.0.9 功能预览
  9. OpenCV与图像处理学习九——连通区域分析算法(含代码)
  10. Java语言Socket接口用法详解
  11. swf转html5批量转换,gif转swf转换工具,gif转swf格式转换器|批量转换
  12. MySQL 查询各科前三名(考虑成绩并列情况)
  13. 计算机基础作业2答案,《计算机基础》作业答案 (2)
  14. Makfile: [ GCC编译选项 ] >CFLAGS参数 -c -o
  15. java实例化类之后如何赋值_深入理解Java对象的创建过程:类的初始化与实例化...
  16. 国产化信创CPU、操作系统、数据库、中间件笔记
  17. Week 8 Deep learning for object detection
  18. java并发编程(并发编程的三个问题)
  19. vb.net合伙数据库access(一)——连接数据库
  20. matlab元胞自动机学风演化,土建學院研究生培养方案调研报告.docx

热门文章

  1. 夜深人静写算法(二) - 动态规划
  2. AutoSAR系列讲解(深入篇)14.2-Mcal Port配置
  3. Word 批量添加 图片边框
  4. 腾讯 AI Lab 2020 年度回顾
  5. 深度学习与人工神经网络的介绍
  6. lenovo计算机无法启动,联想台式电脑不能启动开机
  7. 服务器系统自检可以关吗,1366电脑服务器开机自检肿么关闭
  8. HttpClient:connection still allocated.解决方法
  9. 服务器固态盘装系统,怎么把固态硬盘设置为系统盘
  10. python,计算并发现闰月的规律