hive学习笔记-高级查询
聚合函数
count计数
count(*):不全都是NULL。就加1;count(1):当仅仅要有一列是NULL就不会加1;count(col):当col列不为空就会加1
sum求和
sum(可转成数字的值)返回bigint。比方求和后加1,1必须转化成为bigint类型,sum(col)+cast(1 as bigint)
avg求平均值
avg(可转化成数字的值)返回double
distinct不同值的个数
count(distinct col)
Order by
依照某些字段排序,后面能够有非常多列进行排序,默认是字典排序。Order by 是全局排序,Order by这个过程仅仅须要一个且仅仅有一个reduce。不管你配置多少各reduce,到最后都会汇总一个reduce进行Order by,所以当数据量非常大的时候要考虑好是否使用Order by;
select c1,other from tableName where condition order by c1,c2[asc|desc]
如:select * from usertable order id asc,name desc;
Group by
依据某些字段值进行分组,有同样值的放到一起。注意,select后面查询的列。除了聚合函数外都应该出现再group by中,group by后面也能够跟表达式,如substr(col),对某一列字段截取的部分进行分组。having是在group by之后进一步进行筛选的。他使用了reduce操作。受限于reduce个数。设置reduce參数mapred.reduce.tasks。文件的输出个数就是reduce个数,文件大小与reduce处理的数据量相关。存在的问题:网络负载过重。数据倾斜,优化參数hive.groupby,skeweindata设置为true(起两个mapreduce,第一个在每一个key加一个随机值,然后进行group
by)。
select c1,[c2..] count(1).. from test_group where condition group by c1[,c2..] [having]
set mapred.reduce.tasks=n;
set hive.groupby.skewindata=true;
select name,count(1) as num from tableName group by name;
group by 与 distinct
都能达到去重的效果,走的mapreduce都是一样的流程,其reduce个数优化,还有hive.groupby.skewindata都起作用。group by中查找的必须在group by 中出现,可是distinct能够,可是distinct须要后面的多个col都同样才会去重。
Join表连接
两个表m和n之间依照on条件进行连接,m中的一条记录和n中的一条记录组成一条新的记录。
join:等值连接(内连接)。仅仅有m和n中同一时候存在才会筛选出。
如:
tableA col1 col2
1 w
2 j
4 g
tableB col3 col4
1 y
1 t
5 z
select a.col1,a.col2,b.col4 from (select col1,col2 from tableA) a join (select col3,col4 from tableB) b on a.col1=b.col3
result:
1 w y
1 w t
left outer join:左边的表的值不管是否在右表中出现,都会作为结果输出,假设右边的值不存在则为NULL。
而右边表的值仅仅有在左边的值出现才会出现。
select a.col1,a.col2,b.col4 from (select col1,col2 from tableA) a left outer join (select col3,col4 tableB) b on a.col1=b.col3
result:
1 w y
1 w t
2 j NULL
4 g NULL
right outer join:与left outer join正相反
result
1 w y
1 j y
5 NULL z
left semi join :类似exists,推断左表中数据是否在右表中。假设在则筛选出来。
select a.col1,a.col2,b.col4 from (select col1,col2 from tableA) a left semi join (select col3,col4 from tableB) b on a.col1=b.col3
result:
1 w y
mapjoin:在map端完毕join操作。不须要reduce,基于内存做join,属于优化操作,可是须要将整个表载入到内存中去。
select m.col1 as col1,m.col2 as col2,n.col3 as col3
from
(select col1,col2 from tableA where condition(在map端运行) )m
[left outer|right outer|left semi] join
(select col3 from tableB)n
on m.col1= n.col3 [and condition]
where condition(在reduce端运行)
注:hive中join不能使用类似<,>这样的比較
假设寻在数据倾斜问题能够设置:
set hive.optimize.skewjoin=true;
MapJoin
在map端把小表载入到内存中,然后读取大表。和内存中的小表进行比較。当中使用了分布式缓存。
优缺点:
不消耗reduce资源(reduce相对较小);降低reduce操作,加快程序运行;降低网络负载;
占用部分内存,所以载入到内存中的表不能太大,由于每一个计算节点都会载入一次。生成较多小文件。(每一个map相应一个输出文件)
使用MapJoin:
自己主动使用
配置:set hive.auto.convert.join=true;
set hive.mapjoin.smalltable.filesize=n(当查询的表中小表小于等于这个值就会使用MapJoin。
可是可能会有非常多任务。都载入进去了消耗内存)
手动指定
slelet /*+mapjoin(n)*/ m.col1,m.col2,n.col4 from (...)m join (...)n on m.col1=n.col3
也就是在select中将小表使用/*+mapjoin(n)*/參数载入到内存中去
Distribute by 和 Sort by
distribute by col1,col2
依照col列将数据分散到不同的reduce
sort by col1,col2[asc|desc]
将col1。col2列排序(这是将每一个reduce内部排序)
两者接合使用,确保每一个reduce的输出都是有序的,可是总体不是有序的。
distribute by 和 group by
都是依照key划分数据
都是用reduce操作
distribute by仅仅是单纯的分散数据。而group by是将同样的key聚集到一起,兴许必须是聚合操作
order by 和sort by
order by确保全局有序
sort by仅仅是保证每一个reduce上面输出有序。假设仅仅有一个reduce时。和order by效果一样
应用场景
小文件过多(通过reduce个数来控制输出文件个数)
文件超大
map输出的文件大小不均
reduce输出的文件大小不均
cluster by
把有同样的数据聚集到一起。并排序
cluster by col
相当于:distribute by col col order by col
union all
将多个表的数据合并成一个表,hive部支持union操作
select col
from(
select a as col from t1
union all
select b as col from t2
)tmp
没有reduce操作
要求:
字段名字一样(能够通过as使用别名)
字段类型一样
字段个数一样(子查询的个数)
字表不能又别名(join每一个子查询要别名)
合并之后的表假设须要查询数据。则须要给合并结果起别名
hive学习笔记-高级查询的更多相关文章
- 数据库MySQL学习笔记高级篇
数据库MySQL学习笔记高级篇 写在前面 学习链接:数据库 MySQL 视频教程全集 1. mysql的架构介绍 mysql简介 概述 高级Mysql 完整的mysql优化需要很深的功底,大公司甚至有 ...
- hive学习笔记之一:基本数据类型
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- hive学习笔记之四:分区表
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- hive学习笔记之五:分桶
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- hive学习笔记之六:HiveQL基础
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- hive学习笔记之七:内置函数
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- hive学习笔记之十一:UDTF
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- mybatis学习笔记(14)-查询缓存之中的一个级缓存
mybatis学习笔记(14)-查询缓存之中的一个级缓存 标签: mybatis mybatis学习笔记14-查询缓存之中的一个级缓存 查询缓存 一级缓存 一级缓存工作原理 一级缓存測试 一级缓存应用 ...
- Linux学习笔记(七) 查询系统
1.查看命令 (1)man 可以使用 man 命令名称 命令查看某个命令的详细用法,其显示的内容如下: NAME:命令名称 SYNOPSIS:语法 DESCRIPTION:说明 OPTIONS:选项 ...
随机推荐
- hdoj--3123--GCC(技巧阶乘取余)
GCC Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Subm ...
- POJ 3276 枚举+差分?
题意: 思路: 先枚举一下k 贪心:如果当前是B那么就翻 差分一下序列 mod2 就OK了 //By SiriusRen #include <cstdio> #include <cs ...
- BZOJ 1055 DP
思路: f[i][j][k]表示i到j匹配了字母k if(m,n能匹配上k) f[i][j][k]|=f[i][l][m]&f[l+1][j][n] 一个大枚举 就OK了~ //By Siri ...
- Linux系统病毒防治
Linux系统病毒防治 一.Linux病毒的历史 1996年出现的Staog是Linux系统下的第一个病毒,它出自澳大利亚一个叫VLAD的组织.Staog病毒是用汇编语言编写,专门感染二进制文件,并通 ...
- ToF相机学习笔记之基本知识
ToF相机属于一种非接触式光学传感器,通过计算发射激光的飞行时间获取对应像素的深度信息.就非接触式距离测量方法而言,其分类可用下表表示如下: 1.1 ToF传感器基础 一个逐点式的ToF传感器采用了雷 ...
- Ubuntu 16.04 实现有线 无线同时用
因为工作的原因,经常会用有线网卡连接服务器进行配置,无线网卡上外网. 一.查看当前网关信息 pipci@ubuntu:~$ ip route showdefault via 192.168.2.1 d ...
- 如何在Centos官网下载所需版本的Centos——靠谱的Centos下载教程
很多小伙伴不知道对应版本的Centos怎么下载,最近小编整理了一份Centos详细的下载教程,希望小伙伴们不在为下不到对应版本的Centos而苦恼. 1.进入Centos官网:https://www. ...
- JavaScript进阶之执行上下文和执行栈
js引擎的执行过程 执行上下文和执行栈属于js引擎的执行过程的预编译阶段. 执行上下文(Execution Context) 执行上下文是当前 JavaScript 代码被解析和执行时所在环境的抽象概 ...
- 学习《概率机器人》中英文PDF+Probabilistic Robotics
研究机器人时,使机器人能够应对环境.传感器.执行机构.内部模型.近似算法等所带来的不确定性是必须面对的问题. <概率机器人>对概率机器人学这一新兴领域进行了全面的介绍.概率机器人学依赖统计 ...
- 进阶《Python高性能编程》中文PDF+英文PDF+源代码
入门使用高性能 Python,建议参考<Python高性能编程>,例子给的很多,讲到高性能就会提到性能监控,里面有cpu mem 方法的度量,网络讲了一点异步,net profiler 没 ...