1、coalesce

语法:

COALESCE ( expression [ ,...n ] )

  参数:

  expression 任何类型的表达式。

  返回类型:

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

  备注

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

  比较 COALESCE 和 CASE

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 ajoin (select * from test) bwhere 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) awhere 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;

转载于:https://www.cnblogs.com/zichun-zeng/p/5899946.html

hive sql 学习笔记相关推荐

  1. hive 两个没有null指定的表左关联的结果有null_《数据仓库篇》——Hive的学习笔记3...

    <数据仓库篇>--Hive的学习笔记1 讲了Hive的原理,<数据仓库篇>--Hive的学习笔记2 讲了Hive的操作,本篇将介绍Hive的优化. 本篇将Hive的优化分成三个 ...

  2. 第55课:60分钟内从零起步驾驭Hive实战学习笔记

    第55课:60分钟内从零起步驾驭Hive实战学习笔记 本期内容: 1. Hive本质解析 2. Hive安装实战 3. 使用Hive操作搜索引擎数据实战 SparkSQL前身是Shark,Shark强 ...

  3. 判断题:oracle自带的sql语言环境是pl/sql,Oracle之PL/SQL学习笔记之数据类型(三)

    Oracle之PL/SQL学习笔记之数据类型(三) 所有的编程语言中变量是使用最频繁的.PL/SQL作为一个面向过程的数据库编程语言同样少不了变量,利用变量可以把PL/SQL块需要的参数传递进来,做到 ...

  4. Spark学习笔记(7)---Spark SQL学习笔记

    Spark SQL学习笔记 Spark SQL学习笔记设计到很多代码操作,所以就放在github, https://github.com/yangtong123/RoadOfStudySpark/bl ...

  5. Oracle之PL/SQL学习笔记之有名块练习

    2019独角兽企业重金招聘Python工程师标准>>> Oracle之PL/SQL学习笔记之有名块练习 存储过程案例: 案例1: 根据雇员姓名跟新雇员工资,如果雇员不存在输出没有该雇 ...

  6. 【LittleXi】sql学习笔记

    [LittleXi]sql学习笔记 数据类型 INT 整数型 VARCHAR 字符串 DECIMAL(a,b) 浮点型(a代表位数,b代表小数位位数) BLOB 图片.影片.档案 DATA 日期 XX ...

  7. 探针一号的SQL学习笔记

    SQL学习笔记 文章目录 SQL学习笔记 1.问题 2.SQL基本语句 3.SQL基本数据查询 4.SQL复杂点的数据查询 5.DML操作 6.数据表操作 1.问题 什么是数据库? 是一个仓库,可以按 ...

  8. SQL学习笔记_Aliyun4

    SQL学习笔记_Aliyun4 本笔记为阿里云天池龙珠计划SQL训练营的学习内容,链接为:https://tianchi.aliyun.com/specials/promotion/aicampsql ...

  9. 简简单单 My SQL 学习笔记(2)——分组和简单数据的查询

    初始数据 创建表(要记得先选择好我们的数据库 use+数据库名) create table student( studentno int(4) primary key not null auto_in ...

最新文章

  1. oracle更改控制文件位置
  2. [WPF]自定义鼠标指针
  3. 编写你的第一个 Flutter App
  4. 明星居然来我们宜昌保利时代拍戏——电影《被光抓走的人》
  5. java 访问 网络swf_JAVA访问网络资源
  6. python 类继承与子类实例初始化
  7. SAP 电商云 Spartacus UI B2B checkout 点击 Continue 不能跳转到下一页面
  8. 容器编排技术 -- kubernetes 通过环境变量向容器暴露 Pod 信息
  9. python计算auc的代码_python是怎么计算auc指标的?
  10. iOS 8 自适应 Cell
  11. Python三种设计模式
  12. 开wifi微信定位服务器,企业微信wifi定位
  13. 【flv解析】Audio Specific Config 协议及解析
  14. linux centos7下源码 tar安装mysql5.7.22或mysql5.7.20 图文详解
  15. s饥荒服务器物品id,流年饥荒控制台指令大全+物品大全+服务器管理命令大全.docx...
  16. Windows10动态壁纸Wallpaper软件
  17. 阿里云ECS服务器修复漏洞
  18. ubuntu18.04 安装java
  19. 这个高仿微信,差点我就信了
  20. 智能未来:聚焦2018世界人工智能大会

热门文章

  1. (JAVA学习笔记) 接口
  2. Python3算法基础练习:编程100例(6 ~ 10)
  3. 解决Fedora 自己编译的内核不能运行Virtualbox的问题。
  4. Gradle项目中gradle.build文件中的buildScript代码块
  5. 设置input标签禁用_HTML option 标签
  6. mysql索引的方法_mysql查看索引方法
  7. 云原生生态周报 Vol. 15 | K8s 安全审计报告发布
  8. 合并两个有序数组python_Python3合并两个有序数组代码实例
  9. 字符串反转python_Python 反转字符串(reverse)的方法小结
  10. c语言线性表顺序存储实验小结,数据结构学习笔记-线性表顺序存储(C语言实现)...