聚合函数

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学习笔记-高级查询的更多相关文章

  1. 数据库MySQL学习笔记高级篇

    数据库MySQL学习笔记高级篇 写在前面 学习链接:数据库 MySQL 视频教程全集 1. mysql的架构介绍 mysql简介 概述 高级Mysql 完整的mysql优化需要很深的功底,大公司甚至有 ...

  2. hive学习笔记之一:基本数据类型

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  3. hive学习笔记之四:分区表

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  4. hive学习笔记之五:分桶

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  5. hive学习笔记之六:HiveQL基础

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  6. hive学习笔记之七:内置函数

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  7. hive学习笔记之十一:UDTF

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  8. mybatis学习笔记(14)-查询缓存之中的一个级缓存

    mybatis学习笔记(14)-查询缓存之中的一个级缓存 标签: mybatis mybatis学习笔记14-查询缓存之中的一个级缓存 查询缓存 一级缓存 一级缓存工作原理 一级缓存測试 一级缓存应用 ...

  9. Linux学习笔记(七) 查询系统

    1.查看命令 (1)man 可以使用 man 命令名称 命令查看某个命令的详细用法,其显示的内容如下: NAME:命令名称 SYNOPSIS:语法 DESCRIPTION:说明 OPTIONS:选项 ...

随机推荐

  1. Android studio树形

    原创作品,允许转载,转载时请务必声明作者信息和本声明.  http://www.cnblogs.com/zhu520/p/8349553.html 这个是上网找了好久才弄出来的,我把我上网找的总结也写 ...

  2. hbase源码系列(十二)Get、Scan在服务端是如何处理

    hbase源码系列(十二)Get.Scan在服务端是如何处理?   继上一篇讲了Put和Delete之后,这一篇我们讲Get和Scan, 因为我发现这两个操作几乎是一样的过程,就像之前的Put和Del ...

  3. 一些牛人的IOS博客,mark下慢慢学习

    http://blog.devtang.com/                  唐巧的个人blog http://gracelancy.com/     Lancy's blog http://b ...

  4. iOS 7 UI 过渡指南 - 支持续 iOS 6(iOS 7 UI Transition Guide - Supporting iOS 6)

    iOS 7 UI Transition Guide Preparing for Transition Before You Start Scoping the Project Supporting i ...

  5. WordPress改动新用户注冊邮件内容--自己定义插件

    有些开放用户注冊功能的WordPress站点,可能有这么一项需求,就是用户注冊成功后,系统会分别给站点管理员和新用户发送一封通知邮件.给管理员发送的是新用户的username和Email,给刚刚注冊的 ...

  6. html 笔记2

    .css重用 <style> 如果整个页面的宽度 > 900px时: { .c{ 共有 } .c1{ 独有 } } .c2{ 独有 } </style> <div ...

  7. kafka offset的存储问题

    注意:从kafka-0.9版本及以后,kafka的消费者组和offset信息就不存zookeeper了,而是存到broker服务器上,所以,如果你为某个消费者指定了一个消费者组名称(group.id) ...

  8. 2015北京网络赛 G Boxes BFS+打表

    G Boxes 题意:n个位置摆有n个箱子,每次移动只能把相邻的垒起来,且上面的必须小于下面的.求摆成升序需要移动多少步. 思路:这里的n很小,只有7.但是bfs最快的情况需要2s左右,所以就打表了. ...

  9. vue.js路由vue-router(一)——简单路由基础

    前言 vue.js除了拥有组件开发体系之外,还有自己的路由vue-router.在没有使用路由之前,我们页面的跳转要么是后台进行管控,要么是用a标签写链接.使用vue-router后,我们可以自己定义 ...

  10. Linux samba服务器安装调试。

    samba 做为主要的windown 和 Linux 通讯的服务器之一. 1. 查看是否安装了smb服务. #rpm -ga|grep samba     或者 #service smb status ...