Spark SQL之SQL优化

主要关注于执行性能问题

1、避免使用不必要的UDF函数

UDF:用户定义函数,可以直接在SQL语句中计算的函数,如:count、sum、avg、max、min等

2、没有指定数据分区

SQL-1: SELECT date FROM test_table WHERE date = '20170829' and value = 1;
SQL-2: SELECT date FROM test_table PARTITION(p_20170829) p WHERE value = 1

SQL-1虽然通过where表达式能够筛选到并执行所需的分区,但是在分析的时候会先获取所有的分区列表再进行筛选,会导致更多的内存占用,显然SQL-2更优

3、避免使用笛卡尔积

简单了解什么是sql里的笛卡尔积

SQL-1: select * from gbk, utf8 where gbk.key= utf8.key
SQL-2: select * from gbk join utf8 where gbk.key= utf8.key

上面是先对tabel进行笛卡尔积再where筛选,应当按如下方式书写

select * from gbk join utf8 on gbk.key= utf8.key

4、show Rowcount

读取一个表有多少行记录,虽然count也可以,但是速度非常慢!

show rowcount extended test;

按分区来显示每个分区有多少行记录

5、show Tablesize

读取一个表有多大,单位是字节

show tablesize extended test;

6、避免使用delete和update

7、当存在小表join的时候,查看是否可以使用mapjoin

MAPJION会把小表全部读入内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配,由于在map是进行了join操作,省去了reduce运行的效率也会高很多。
简单说就是在Map阶段将小表读入内存,顺序扫描大表完成Join。这样就不会由于数据倾斜导致某个reduce上落数据太多而失败。

8、数据倾斜

Join的时候,相同的key会hash到同一task中进行。如果某个key值太多,这个task就会成为瓶颈。

一种是唯一值非常少,极少数值有非常多的记录值(唯一值少于几千)
一种是唯一值比较多,这个字段的某些值有远远多于其他值的记录数,但是它的占比也小于百分之一或千分之一

简单来说就是大量的相同key被partition分配到一个分区里,造成了’一个人累死,其他人闲死’的情况,这种情况是我们不能接受的,这也违背了并行计算的初衷,首先一个节点要承受着巨大的压力,而其他节点计算完毕后要一直等待这个忙碌的节点,也拖累了整体的计算时间,可以说效率是十分低下的.

判断数据倾斜的方法:

任务中单个或者少量的task拖慢整个任务速度。
通过查看id的分布,返回表A的id分布情况,通过返回结果可以看出是否某些id的数量远大于其他。

select id,count(id) as id_nums group by id order by num desc

处理数据倾斜的方法

1、过滤或者去重:如果导致倾斜的id 在最后的结果没有作用,可以在Join 之前将其过滤掉。例如,id=NULL 的数据往往是多余的。
2、Map Join:如果join的表不大,使用Map Join。
3、数据分离:可以将表A 的数据分为两部分A1和A2,A1中不包含数据倾斜的数据(id=b),A2中只包含数据倾斜的数据(id=a)。A1和A2 分别与B 进行Join,然后将结果Union。SQL 如下所示。A1与A2 的Join 没有数据倾斜的问题。由于A2通常不会很大,A2与B的Join 采用Map Join。但是如果A2很大则不适用
4、数据打散:将有数据倾斜的表(A)中的id加上后缀,起到“打散”的作用,即"id_0"-“id_2”。为了结果正确性,小表B中的id需要将每条数据都“复制”多份。如下图所示。

数据分离:

select * from (
select * from A1 join B on A1.id = B.id
union all
select /*+ MAPJOIN (A2) */ * from A2 join B on A2.id = B.id
)

数据打散:
处理之前需要先查看一下id的分布情况

表A:
SELECT id, value, concat(id, string1(cast(rand() * 10000 as int)%3)) as new_id
FROM A;
表B:
SELECT id, value, concat(id, suffix) as new_id
FROM (SELECT id, value, suffixFROM B Lateral View explode(array(0,1,2)) tmp as suffix
)

9、join与groupby的顺序

如果Join 后有聚合函数操作,尽可能把聚合操作放到Join 之前,这样在Join 时 key 是单一的,避免数据倾斜。例如,

select t1.key, t1.total from
(select key ,sum(value) as total from t1 group by key
) t1
join t2 on t1.key = t2.key

前提是t2的key没有重复

Spark SQL之SQL优化相关推荐

  1. SQL语句性能优化--LECCO SQL Expert

    SQL语句的优化是将性能低下的SQL语句转换成目的相同的性能优异的SQL语句. 人工智能自动SQL优化就是使用人工智能技术,自动对SQL语句进行重写,从而找到性能最好的等效SQL语句. 数据库性能的优 ...

  2. SQL SERVER全面优化-------索引有多重要?

    想了好久索引的重要性应该怎么写?讲原理结构?我估计大部分人不愿意看,也不愿意花那么多时间仔细研究.光写应用?感觉不明白原理一样不会用.举例说明?情况太多也写不全....到底该怎么写呢? 随便写吧,想到 ...

  3. SQL SERVER全面优化-------写出好语句是习惯

    前几篇文章已经从整体提供了诊断数据库的各个方面问题的基本思路...也许对你很有用,也许你觉得离自己太远.那么今天我们从语句的一些优化写法及一些简单优化方法做一个介绍.这对于很多开发人员来说还是很有用的 ...

  4. mysql解释器优化_MySQL——SQL性能分析优化利器之Explain

    系统性能的优劣取决于我们sql的查询速度,MySQL Explain命令是分析SQL性能及优化不可缺少的一部分. Explain被我们称为解释器,通过 explain 我们可以知道以下信息:表的读取顺 ...

  5. sql server 2005 优化方法

    sql server 2005 优化方法<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office ...

  6. 52条SQL语句性能优化策略

    本文会提到 52 条 SQL 语句性能优化策略. 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 WHERE 及 ORDER BY 涉及的列上建立索引. 2.应尽量避免在 WHERE 子句中对字 ...

  7. [Spark][Hive][Python][SQL]Spark 读取Hive表的小例子

    [Spark][Hive][Python][SQL]Spark 读取Hive表的小例子 $ cat customers.txt 1 Ali us 2 Bsb ca 3 Carls mx $ hive ...

  8. mysql 排序字段是否需要建索引_MySQL索引详解(优缺点,何时需要/不需要创建索引,索引及sql语句的优化)...

    一.什么是索引? 索引是对数据库表中的一列或多列值进行排序的一种结构,使用索引可以快速访问数据库表中的特定信息. 二.索引的作用? 索引相当于图书上的目录,可以根据目录上的页码快速找到所需的内容,提高 ...

  9. 数据库-优化-SQL及索引优化

    SQL及索引优化 mysql安装与卸载(linux在线安装与卸载) 数据库版本选择 1.查看数据库的版本 select @@version; 2.准备数据 网址:https://dev.mysql.c ...

最新文章

  1. MySQL:left join 避坑指南
  2. Caffe学习记录(十二) ICNet分割网络学习二
  3. 微信 php post json,微信企业号:如何POST JSON数据发送消息给企业号成员
  4. 4、CSS 高级语法
  5. Network POJ-3694
  6. 启动/关闭数据库、实例及服务
  7. Android-- SharedPreferences数据存储XML文件的方法
  8. NOIP2010-普及组初赛C语言解析
  9. linux gpio-led
  10. mysql建表时创建索引语句_创建表的时候创建索引
  11. Linux/Centos: readelf命令使用说明
  12. 从图书馆进入网络刷题练习与考试平台
  13. MUI框架开发APP详解,一篇就够了
  14. Spring Data Redis 官方中文文档
  15. kuka机器人码垛编程网盘_KUKA机器人码垛程序怎么写(案例)
  16. springBoot学习笔记(6)——@Valid和@Validated的使用
  17. 电力施工作业现场安全综合管控平台项目解决方案
  18. stm32笔记02——ST-Link下载器使用说明
  19. 2021.03.06【NOIP提高B组】模拟 总结
  20. SISR深度学习主要方法简述

热门文章

  1. 【JVM】jvm的体系结构
  2. C语言-7月22日- NULL和nullptr的深入了解以及VScode对nullptr语句报错问题的解决
  3. matlab符号矩阵分解,在Matlab中将符号分解的输出转换为矩阵表示
  4. UML 的九种模型图.UML用例图.ER图.UML项目结构图总结
  5. Android6.0权限管理-PermissionsDispatcher
  6. win10自带移动热点 无法设置
  7. 罗纳尔多~~~~~~
  8. kali安装docker教程
  9. 深入职场,你需要知道的20个规则
  10. python爬取天天基金_分享天天基金数据爬取的Python脚本