1、coalesce

语法:

COALESCE ( expression [ ,...n ] )

  参数:

  expression 任何类型的表达式。

  返回类型:

  返回数据类型优先级最高的 expression 的数据类型。 如果所有表达式都不可为 Null,则结果的类型也不可为 Null。

  备注

 
   如果所有参数均为 NULL,则 COALESCE 返回 NULL。 至少应有一个 Null 值为 NULL 类型。
 

COALESCE 表达式是 CASE 表达式的语法快捷方式。 即查询优化器将代码 COALESCE(expression1,...n) 重写为以下 CASE 表达式:

CASE

WHEN (expression1 IS NOT NULL) THEN expression1

WHEN (expression2 IS NOT NULL) THEN expression2

...

ELSE expressionN

END

这意味着将多次计算输入值(expression1expression2expressionN 等)。 此外,为了符合 SQL 标准,包含子查询的值表达式被视为不确定的且子查询被计算两次。 在每种情况中,第一次计算和后续计算可能返回不同的结果。

2、having子句

  sql中having子句与where子句类似,都是表示条件的设定,它们的区别在于,having子句在查询过程中慢于聚合语句(sum,min,max,avg,count);而where子句在查询过程中则快于聚合语句(sum,min,max,avg,count)。

  简单说来:

  where子句:  
  select sum(num) as rmb from order where id>10  
  //先查询出id大于10的记录才能进行聚合语句

  having子句:  
  select reportsto as manager, count(*) as reports from employees  
  group by reportsto having count(*) > 4

  //having的条件表达式count()是一个聚合语句,因此having的执行一定慢于聚合语句count,如果换成where则会出错。

  //统计分组数据时用到聚合语句,对分组数据再次判断时要用having。如果不用这些关系就不存在使用having。直接使用where就行了。

  having就是来弥补where在分组数据判断时的不足。因为where要快于聚合语句。

  如果你对何时应该使用WHERE,何时使用HAVING仍旧很迷惑,请遵照下面的说明:   

  WHERE语句在GROUP BY语句之前;SQL会在分组之前计算WHERE语句。   

  HAVING语句在GROUP BY语句之后;SQL会在分组之后计算HAVING语句。

3、mapjoin

使用MAPJOIN时,需要注意:
1、LEFT OUTER JOIN的左表必须是大表;
2、RIGHT OUTER JOIN的右表必须是大表;
3、INNER JOIN左表或右表均可以作为大表;
4、FULL OUTER JOIN不能使用MAPJOIN;
5、MAPJOIN支持小表为子查询;
6、使用MAPJOIN时需要引用小表或是子查询时,需要引用别名;
7、在MAPJOIN中,可以使用不等值连接或者使用OR连接多个条件;

  mapjoin里写的是小表,且left outer join时小表写在join的后面;

  hive中使用mapjoin有时可以大大提高sql语句的执行效率。

  其原理是:它会把小表全部读入内存中,在map的时候直接拿另外一张表的数据和内存中表的数据做匹配,进行join操作,这样省去了reduce。

  (1)在“关联操作中有一个表非常小,另一个表很大”的场景下,mapjoin就不会由于数据倾斜而导致某个reduce上落数据太多而失败;

  例子:

SELECT /*+ MAPJOIN(b) */ a.key, a.value
FROM a JOIN b ON a.key = b.key
  • does not need a reducer. For every mapper of A, B is read completely. The restriction is that a FULL/RIGHT OUTER JOIN b cannot be performed.

(2)在需要进行“不等值连接操作”的场景中(如a.x<b.y 或 a.x like b.y 等),由于where子句中的不等值join操作产生笛卡尔积,引起数据异常增大,速度会变慢;而mapjoin则可以提高此操作的效率,即使遇到笛卡尔积也不会对运行速度带来太大影响;

  例子:

  

select /*+ MAPJOIN(a) */
a.start_level, b.*
from dim_level a
join (select * from test) b
where b.xx>=a.start_level and b.xx<end_level;

  在同时需要进行大小表关联和不等值关联的情景下,用mapjoin会有更明显的效果,尤其是大表数据倾斜比较严重的时候。

  例子:

  使用mapjoin前:

create table hive_no_mapjoin as 

  select f.id,f.dt, coalesce(k.amt,0.0) amt from(

  select a.id,t.dt from hive_dt t join (select id, min(dt) min_dt from hive_mapjoin group by id) a
  where t.dt>= a.min_dt) f
  left outer join hive_mapjoin k on f.dt = k.dt and f.id = k.id;

  使用mapjoin后:

create table hive_ok_mapjoin as select f.id,f.dt, coalesce(k.amt,0.0) amt from(

select /*+ mapjoin(t) */ a.id,t.dtfrom hive_dt t
join ( select id, min(dt) min_dt from hive_mapjoin group by id) a
where t.dt>= a.min_dt) f
left outer join tmp.tst1 kon f.dt = k.dt and f.id = k.id;

  友情链接:http://www.cnblogs.com/tmeily/p/4250858.html

       http://www.ithao123.cn/content-579190.html

4、hive中,group by 需要比较多的reduce , order by rand()需要比较多的map reduce,所以当数据量比较大的时候,如果这两个动作同时执行,会很耗资源,解决的办法是分成两步,先order by rand() limit n 取出来,然后再从这个结果里面group by;

5、hive中,需要select 多个字段,但只要distinct某个字段并列出它的值,可以用:

select cid,count(distinct cid) from credit.vec_sim_pairs where dt=${CUR_DATE} and cid!='0' group by cid;
忽略count(distinct cid)这一列就可以了。
参考来源:http://www.jb51.net/article/24717.htm
 
6、查看某个表的某个分区的hdfs路径 语句:
use database;
show table extended like table_name partition(dt='%Y%m%d')
 
7、随机抽样的语句:(1)select * from tablename TABLESAMPLE(n PERCENT|ROWS|ByteLengthLiteral ) where ……
其中,n percent将会抽取 n%的比例数据 (但是这种方法结果出来的数据并没有真的是按比例抽取)
         (2)select * from my_table distribute by rand() sort by rand() limit 10000;(亲测可靠)
 
参考:http://www.joefkelley.com/736/
   http://www.aichengxu.com/other/9663663.htm
     http://lxw1234.com/archives/2015/08/444.htm
8、hive中字段类型转换
  cast(field as type)
或者:
  convert(field,type)
 
 9、explain
  使用explain可以查看hql语句运行的详细信息;
例如:

explain select a.key c1, a.value c2, b.key c3, b.value c4 from src a join src_skewjoin1 b on a.key = b.key;

hive sql 学习笔记的更多相关文章

  1. ORALCE PL/SQL学习笔记

    ORALCE  PL/SQL学习笔记 详情见自己电脑的备份数据资料

  2. Oracle之PL/SQL学习笔记

    自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧.是以前做的,一直在压箱底,今天拿出来整理了一下,给大家分享,有不足之处还望大家 ...

  3. SQL学习笔记

    SQL(Structured Query Language)学习笔记 [TOC] Terminal登录数据库 1.登录mysql -u root -p ; 2.显示所有数据库show database ...

  4. HIVE优化学习笔记

    概述 之前写过关于hive的已经有两篇随笔了,但是作者依然还是一枚小白,现在把那些杂七杂八的总结一下,供以后查阅和总结.今天的文章介绍一下hive的优化.hive是好多公司都在使用的东西,也有好多大公 ...

  5. 60分钟内从零起步驾驭Hive实战学习笔记

    本博文的主要内容是: 1. Hive本质解析 2. Hive安装实战 3. 使用Hive操作搜索引擎数据实战 SparkSQL前身是Shark,Shark强烈依赖于Hive.Spark原来没有做SQL ...

  6. [SQL学习笔记][用exists代替全称量词 ]

    学习sql的必经问题. 学生表student (id学号 Sname姓名 Sdept所在系) 课程表Course (crscode课程号 name课程名) 学生选课表transcript (studi ...

  7. SQL学习笔记——SQL初入门,Ubuntu下MySQL的安装

          刚开始接触sql,于是准备在Ubuntu下学习sql,就跟着itercast的sql教程开始入门了. 下面只是我个人的记录,高手请绕道: 一. 在安装之前,我们可以用下面这个命令通过开放端 ...

  8. pl/sql学习笔记---马士兵教程38-48

    Procedure Language/Structure query Language 一.关于语言学习 1.数据类型 2.语法   通过例子来学习很快就能明白 set serverputout on ...

  9. hive kettle 学习笔记

    学习网址 http://wiki.pentaho.com/display/BAD/Transforming+Data+within+Hive

随机推荐

  1. 小知识点:linux下的mv命令怎么用?

    linux下的mv命令怎么用? mv a.txt b.txt  将a.txt 改名为b.txtmv a.txt /mnt/b.txt    同时更改路径为/mnt/mv a.txt /opt/ftp/ ...

  2. mac 增加/usr/bin目录的操作无权限

    起因:想要往/usr/bin目录下拷贝文件,提示: operation not permitted 解决办法: 1. 重启,启动中长安command+r进入恢复模式 2.顶部菜单拉中打开终端 3. 输 ...

  3. Sonya and Matrix Beauty Codeforces - 1080E

    https://codeforces.com/contest/1080/problem/E 比赛时候一个多小时码不出来... 来看遇到的困难: 1.没有能用的随机unsignedlonglong函数 ...

  4. MiniProfiler NET Core

    MiniProfiler 来分析 ASP.NET Core 应用 它会把结果直接放在页面的左下角,随时可以点击查看:这样的话就可以感知出你的程序运行的怎么样:同时这也意味着,在你开发新功能的同时,可以 ...

  5. (转)linux实战考试题:批量创建用户和密码-看看你会么?

    老男孩教育第五关实战考试题:批量创建10个用户stu01-stu10,并且设置随机8位密码,要求不能用shell的循环(例如:for,while等),只能用linux命令及管道实现. 方法1:[roo ...

  6. abp(net core)+easyui+efcore仓储系统——ABP总体介绍(一)

    在前面我已经介绍了ASP.NET MVC.ASP.NET Razor.WEBAPI等技术.我准备通过一个实践项目来整体应用一下之前介绍的技术.本系列是介绍基于ABP+EasyUI的Web开发框架的形成 ...

  7. 右侧导航栏(动态添加数据到list)

    页面样式 <style> .scroll { position: fixed; right: 5%; top: 5em; background: #ccc; display: none; ...

  8. fleet-运行一个全局的单元

    运行一个全局的单元 正如前面所提到的,全局单元是有用的,用于在您的集群中的所有机器上运行一个单元.它不会比一个普通的单元差太多,而是一个新的x-fleet参数称为Global=true.这是一个示例单 ...

  9. Java_面向对象的 static 和 abstract

    static:表示静态的 static:可以用来修饰属性.方法.代码块(或初始化块).内部类. 一.static修饰属性(类变量): public class TestStatic { //stati ...

  10. Java 反射机制(一)

    阅读<Core Java Volume I --- Fundamentals>反射部分,总觉得许多概念艰涩难懂.模棱两可.我想造成这个结果的主要原因可能是Cay S. Horstmann和 ...