如何让你的 Spark SQL 查询加速数十倍?

先来回答标题所提的问题,这里的答案是列存储,下面对列存储及在列存储加速 Spark SQL 查询速度进行介绍

列存储

什么是列存储

传统的数据库通常以行单位做数据存储,而列式存储(后文均以列存储简称)以列为单位做数据存储,如下:

优势

列存储相比于行存储主要有以下几个优势:

  • 数据即索引,查询是可以跳过不符合条件的数据,只读取需要的数据,降低 IO 数据量(行存储没有索引查询时造成大量 IO,建立索引和物化视图代价较大)
  • 只读取需要的列,进一步降低 IO 数据量,加速扫描性能(行存储会扫描所有列)
  • 由于同一列的数据类型是一样的,可以使用高效的压缩编码来节约存储空间

当然列存储并不是在所有场景都强于行存储,当查询要读取多个列时,行存储一次就能读取多列,而列存储需要读取多次。Spark 原始支持 parquet 和 orc 两个列存储,下文的实践使用 parquet

使用 Parquet 加速 Spark SQL 查询

在我的实践中,使用的 Spark 版本是 2.0.0,测试数据集包含1.18亿条数据,44G,每条数据共有17个字段,假设字段名是 f1,f2...f17。

使用 Parquet 格式的列存储主要带来三个好处

大大节省存储空间

使用行存储占用 44G,将行存储转成 parquet 后仅占用 5.6G,节省了 87.2% 空间,使用 Spark 将数据转成列存储耗时4分钟左右(该值与使用资源相关)

只读取指定行

Sql: select count(distinct f1) from tbInRow/tbInParquet

行存储耗时: 119.7s 列存储耗时: 3.4s 加速 35 倍

跳过不符合条件数据

Sql: select count(f1) from tbInRow/tbInParquet where f1 > 10000

行存储耗时: 102.8s 列存储耗时: 1.3s 加速 78 倍

当然,上文也提到了,列存储在查询需要读取多列时并不占优势: Sql: select f1, f2, f3...f17 from tbInRow/tbInParquet limit 1

行存储耗时: 1.7s 列存储耗时: 1.9s

列存储带来的加速会因为不同的数据,不同的查询,不同的资源情况而不同,也许在你的实践中加速效果可能不如或比我这里例子的更好,这需要我们根据列存储的特性来善用之

参考


本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏容器云生态

自动化监控(一)之zabbix安装与配置

1.1 Zabbix简介    Zabbix是一个企业级的开源分布式监控解决方案,由一个国外的团队持续维护更新,软件可以自由下载使用,运作团队靠提供收费的技术支...

3288

使用Excel分析CloudStack使用记录

本文的内容最初由David Nailey在Build a Cloud博客上撰写。

21110
来自专栏更流畅、简洁的软件开发方式

数据层应该分为两个部分,这样可以更好的“分工”,各自研究自己的功能

     数据层应该分为两个部分(并不是说一定要变成两层)第一个部分是处理SQL语句,包括存储过程的名称,存储过程的参数(一下的SQL语句都包含存储过程名称和存...

2316
来自专栏IT大咖说

知数堂联合创始人叶金荣:MySQL 5.7新时代

摘要 MySQL 5.7版本新增了很多特别实用的功能,截止目前已经发布5.7.17版本,也越来越成熟了,而且Group Replication也GA了。就让我们...

3996
来自专栏PHP在线

优化 MySQL: 3 个简单的小调整

如果你不改变 MySQL 的缺省配置,你的服务器的性能就像题图的坏在一档的法拉利一样 “虎落平阳被犬欺” … 我并不期望成为一个专家级的 DBA,但是,在我优化...

2837
来自专栏PPV课数据科学社区

你用了吗?DBA必备的15款MySQL管理工具

如今,Web应用程序的响应速度是成功的关键法宝之一。它与用户互动,用户对网站的看法,甚至谷歌网站排名情况都有着密不可分的关系。数据库性能是响应速度最重要的因素之...

74011
来自专栏量化投资与机器学习

战斗民族开源神器ClickHouse:一款适合于构建量化回测研究系统的高性能列式数据库(二)

编辑部原创 编译:wally21st、 西西 未经允许,不得转载 Tutorial 对于一些私募、投资机构和个人来说,量化投资研究、回测离不开数据的支持。当数据...

2.5K6
来自专栏杨建荣的学习笔记

关于delete,drop,truncate的问题 (r6笔记第14天)

有一个很常规的问题大量出现在笔试面试中,就是delete,truncate和drop的区别,当然这个问题我们也可以升华一下,通过这个简单的问题其实可以关联到Or...

2905
来自专栏「3306 Pai」社区

Xtrabackup 8.0.1对MySQL8.0の初体験

在9月12号,Percona Xtrabackup 发布关于支持MySQL8.0的备份支持的测试版本。(作者严重怀疑,是不是因Percona的工程师想听iPho...

5522
来自专栏杨建荣的学习笔记

PG学习初体验--源码安装和简单命令(r8笔记第97天)

其实对于PG,自己总是听圈内人说和Oracle很相似,自己也有一些蠢蠢欲动学习的想法,从我的感觉来看,它是介于Oracle和MySQL之间的一种 数据库...

3905

扫码关注云+社区

领取腾讯云代金券