hive sql 学习笔记
1、coalesce
语法:
COALESCE ( expression [ ,...n ] )
参数:
expression 任何类型的表达式。
返回类型:
返回数据类型优先级最高的 expression 的数据类型。 如果所有表达式都不可为 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
这意味着将多次计算输入值(expression1、expression2、expressionN 等)。 此外,为了符合 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某个字段并列出它的值,可以用:
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 学习笔记相关推荐
- hive 两个没有null指定的表左关联的结果有null_《数据仓库篇》——Hive的学习笔记3...
<数据仓库篇>--Hive的学习笔记1 讲了Hive的原理,<数据仓库篇>--Hive的学习笔记2 讲了Hive的操作,本篇将介绍Hive的优化. 本篇将Hive的优化分成三个 ...
- 第55课:60分钟内从零起步驾驭Hive实战学习笔记
第55课:60分钟内从零起步驾驭Hive实战学习笔记 本期内容: 1. Hive本质解析 2. Hive安装实战 3. 使用Hive操作搜索引擎数据实战 SparkSQL前身是Shark,Shark强 ...
- 判断题:oracle自带的sql语言环境是pl/sql,Oracle之PL/SQL学习笔记之数据类型(三)
Oracle之PL/SQL学习笔记之数据类型(三) 所有的编程语言中变量是使用最频繁的.PL/SQL作为一个面向过程的数据库编程语言同样少不了变量,利用变量可以把PL/SQL块需要的参数传递进来,做到 ...
- Spark学习笔记(7)---Spark SQL学习笔记
Spark SQL学习笔记 Spark SQL学习笔记设计到很多代码操作,所以就放在github, https://github.com/yangtong123/RoadOfStudySpark/bl ...
- Oracle之PL/SQL学习笔记之有名块练习
2019独角兽企业重金招聘Python工程师标准>>> Oracle之PL/SQL学习笔记之有名块练习 存储过程案例: 案例1: 根据雇员姓名跟新雇员工资,如果雇员不存在输出没有该雇 ...
- 【LittleXi】sql学习笔记
[LittleXi]sql学习笔记 数据类型 INT 整数型 VARCHAR 字符串 DECIMAL(a,b) 浮点型(a代表位数,b代表小数位位数) BLOB 图片.影片.档案 DATA 日期 XX ...
- 探针一号的SQL学习笔记
SQL学习笔记 文章目录 SQL学习笔记 1.问题 2.SQL基本语句 3.SQL基本数据查询 4.SQL复杂点的数据查询 5.DML操作 6.数据表操作 1.问题 什么是数据库? 是一个仓库,可以按 ...
- SQL学习笔记_Aliyun4
SQL学习笔记_Aliyun4 本笔记为阿里云天池龙珠计划SQL训练营的学习内容,链接为:https://tianchi.aliyun.com/specials/promotion/aicampsql ...
- 简简单单 My SQL 学习笔记(2)——分组和简单数据的查询
初始数据 创建表(要记得先选择好我们的数据库 use+数据库名) create table student( studentno int(4) primary key not null auto_in ...
最新文章
- oracle更改控制文件位置
- [WPF]自定义鼠标指针
- 编写你的第一个 Flutter App
- 明星居然来我们宜昌保利时代拍戏——电影《被光抓走的人》
- java 访问 网络swf_JAVA访问网络资源
- python 类继承与子类实例初始化
- SAP 电商云 Spartacus UI B2B checkout 点击 Continue 不能跳转到下一页面
- 容器编排技术 -- kubernetes 通过环境变量向容器暴露 Pod 信息
- python计算auc的代码_python是怎么计算auc指标的?
- iOS 8 自适应 Cell
- Python三种设计模式
- 开wifi微信定位服务器,企业微信wifi定位
- 【flv解析】Audio Specific Config 协议及解析
- linux centos7下源码 tar安装mysql5.7.22或mysql5.7.20 图文详解
- s饥荒服务器物品id,流年饥荒控制台指令大全+物品大全+服务器管理命令大全.docx...
- Windows10动态壁纸Wallpaper软件
- 阿里云ECS服务器修复漏洞
- ubuntu18.04 安装java
- 这个高仿微信,差点我就信了
- 智能未来:聚焦2018世界人工智能大会
热门文章
- (JAVA学习笔记) 接口
- Python3算法基础练习:编程100例(6 ~ 10)
- 解决Fedora 自己编译的内核不能运行Virtualbox的问题。
- Gradle项目中gradle.build文件中的buildScript代码块
- 设置input标签禁用_HTML option 标签
- mysql索引的方法_mysql查看索引方法
- 云原生生态周报 Vol. 15 | K8s 安全审计报告发布
- 合并两个有序数组python_Python3合并两个有序数组代码实例
- 字符串反转python_Python 反转字符串(reverse)的方法小结
- c语言线性表顺序存储实验小结,数据结构学习笔记-线性表顺序存储(C语言实现)...