spark官方文档_这些未在 Spark SQL 文档中说明的优化措施,你知道吗?

本文来自上周(2020-11-17至2020-11-19)举办的 Data + AI Summit 2020 (原 Spark+AI Summit),主题为《Spark SQL Beyond Official Documentation》的分享,作者 David Vrba,是 Socialbakers 的高级机器学习工程师。

实现高效的 Spark 应用程序并获得最大的性能为目标,通常需要官方文档之外的知识。理解 Spark 的内部流程和特性有助于根据内部优化设计查询,从而在执行期间实现高效率。在这次演讲中,我们将重点讨论 Spark SQL 的一些官方文档中没有很好描述的内部特性,重点在一些基本示例上解释这些特性,同时分享一些性能技巧。

下面是本次分享的超清视频:

本次分享主要有两大主题:

•Spark SQL 中的统计信息(Statistics)•以排序的方式将数据存储在文件中

Spark SQL 中的统计信息(Statistics)

统计信息这块的分享主要包括以下四个方面:

•我们怎么可以看到统计信息•统计信息是如何计算的•统计信息是怎么使用•有什么注意事项?

99ee992181a55285d3b290301283ec66.png

在 Spark 中,我们可以通过以上方法来查看表级别的统计信息、,输出的信息里面有个 Statistics 那行,那就是本次分享要提到的统计信息。

42a457f249936242e17bf586eb5dbfca.png

如果想查看列级别的统计信息,可以使用 DESCRIBE EXTENDED table_name column_name 进行查看。输出的信息可以看到这列的最大最小值、null 的数量、去重之后的值数量等信息。

如果我们使用的是 Apache Spark 3,我们还可以通过 explain(mode="cost") 来查看统计信息:

c67df7c3d78cb3a5ff03e9a1a2a4e31e.png

1d6fb88aa15dcb5b144b9c83945d1565.png

统计信息是通过执行计划树的叶子节点计算的,然后从树的最底层往上传递,同时 Spark 也会利用这些统计信息来修改执行树的执行过程。统计信息的传递主要有两种方法:最简单的方法(Simple way)以及高级方法。

d9327e584acce70585d47a1b884467cc.png

上面就是统计信息的最简单的传递方法,这种方法只传递 sizeInBytes。从右上图可以看出,我们通过 user_id 0 的过滤条件来过滤数据,其实表中肯定没有用户的 user_id 小于 0 ,但是我们可以通过逻辑计划看出,简单的统计信息传递,Filter 节点的统计信息的 sizeInBytes 和 Relation 节点是一样。

6bcb543c4777f848e34545371fa7e6c0.png

高级传递方式的特点是可以传递 sizeInBytes 信息、行数以及列级别的信息。这种传递方式必须使用 Apache Spark 2.2 版本,而且需要打开 CBO(默认没有打开,需要配置 spark.sql.cbo.enabled=true)。上面例子可以看出,统计信息里面只有 sizeInBytes 和 rowCount,并没有列级别的统计信息,特别是 user_id 这列的统计信息。所以 Filter 节点和 Relation 节点的统计信息是一样的,因为 Spark 无法利用这些统计信息算出文件里面到底有多少满足 user_id

5035b75495b339948c0fe3a0165f9ca7.png

如果我们算出 user_id 的统计信息,可以看出,Filter 利用了这些统计信息,算出过滤后的数据行数为0。

135e8a0e232da95688f19de23a267f8a.png

那么,上面提到的统计信息是如何计算的呢?在 Spark 中主要有三种:

•从 metastore 中获取

•利用 Hadoop API 计算,仅仅计算 sizeInBytes•使用 sizeInBytes 的默认值,通过 spark.sql.defaultSizeInBytes 配置,默认为 Long 的最大值。

585ea223d7bfde63077c7d7f36fa9d1f.png

上面是计算流程,图中的每个节点是条件,根据不同条件选择不同的路径。

502e6b734aca8e33cfcde6f86523c286.png

在 Spark 中,统计信息主要在两种情况使用:

•Join 策略选择•多表 Join,调节 Join 表的顺序,这个需要打开 spark.sql.cbo.joinReorder.enable。

以上就是 Spark 统计信息相关的知识点。

以排序的方式将数据存储在文件中

以排序的方式将数据存储到文件主要涉及排序的函数有哪些,怎么将数据以排序的形式存储在文件。

420a95291c65caa636e398a679985a14.png

上面就是 Spark 中排序的算子:

orderBy/sort 这个是 DataFrame 的转换算子,其是在不同的作业粒度对数据进行排序,需要 shuffle 来达到全局的有序;

sortWithinPartitions 这个也是 DataFrame 的转换算子,是分区粒度的排序;•sortBy 这个通常是在 DataFrameWriter 上调用,并且在 write 算子调用之后调用的,一般和 bucketing 算子一起使用,需要配合使用 saveAsTable

d75bf18132e9eb86fe1d59434f3d020c.png

为了有个直观的体验,我们用个例子来介绍。在这个例子中,我们使用 year 这列对数据进行分区;每个分区使用 user_id 来进行排序;每个分区只有一个文件,这个文件是通过 user_id 进行排序的。

ddb0698b4f9d716d011f411672d7ae65.png

很多人会很轻松的写出以上的程序。但是遗憾的是,最后保存在文件系统的文件并没有排序。如果需要保存的数据是有序的,需要保证 partitionColumns 有序, bucketingIdExpression 有序以及 sortColumns 有序的顺序。如果这个没有满足,则 Spark 将忽略之前的排序。

d16d02a9791830854c48768ac61163d4.png

上面例子中因为我们对 year 这列进行分区,但是使用 user_id 进行排序,所以最后保存的文件肯定不会有序。

05046c5f2c4879ba0ed9b1c89b087219.png

如果我们将 sortWithinPartitions('user_id') 修改为 sortWithinPartitions('year', 'user_id') 。这样最后算出的文件就是分区内有序的。

8b29e667c4c544544b2622ec3f47c271.png

到这里我们已经学习了如何使用统计信息来提升我们的 Join 性能,以及如何以有序的方式来存储数据。

好了,今天的分享就到这里,欢迎大家转发+点赞。

Java与大数据架构

7年老码农,10W+关注者。【Java与大数据架构】全面分享Java编程、Spark、Flink、Kafka、Elasticsearch、数据湖等干货。欢迎扫码关注!

d35c6384c586dc44cc610fffa1d81a1f.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355292.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从位图数据取得位图句柄

#include <windows.h> #include <fstream> using namespace std; void main() { ifstream infile("bm.bmp", ios::in | ios::binary); BITMAPFILEHEADER bmpHeader; // 获取文件大小 infile.seekg(0, ios::end); long nfilelen infile.tell…

go从0到1项目实战体系二一:gin框架安装

(1). 设置公用的代理服务地址: 如果设置了全局可忽略. $ export GOPROXYhttps://goproxy.io // linux > go env可以查看 $ export GOPROXYhttps://goproxy.cn // linux国内镜像 $ set GOPROXYhttps://goproxy.io // windows(2). 创建以下目录: 请忘记GOPATH目录…

一键对频对讲机好吗_挑战传统,新型对讲机展现独特一面--极蜂智能网络对讲机...

说起对讲机你首先想到的是什么样子的&#xff0c;是香港电影中警察佩戴的那种&#xff0c;还是国内建筑工地上使用的傻大粗那种&#xff0c;不过无论是哪种形状的&#xff0c;现实中确实非常的实用。不过随着科技的发展&#xff0c;很多不可能的事情已经变为现实&#xff0c;而…

核心动画与UIView

UIView与核心动画区别?(掌握)1.核心动画只作用在layer.2.核心动画看到的都是假像,它并没有去修改UIView的真实位置.什么时候使用核心动画?1.当不需要与用户进行交互,使用核心动画2.当要根据路径做动画时,使用核心动画&#xff1a;CABasicAnimation&#xff0c;CAKeyFrameAnim…

mongodb 性能测试_MongoDB性能测试

mongodb 性能测试因此&#xff0c;今天早上&#xff0c;我在mongo shell中四处乱逛。 我想出了三种不同的方式来聚合所需的数据&#xff0c;但是不确定随后应移植哪种代码以在应用程序中使用。 那么&#xff0c;我将如何决定实施哪种方法呢&#xff1f; 好吧&#xff0c;让我们…

swift x输入流_Swift 中不同窗体的切换和传递数据 (segue 的用法)

废话不多说&#xff0c;直接进入正题首先在 storyboard 中新建一个 ViewController&#xff0c;再新建一个名为 NewViewController 的 cocoa touch class 文件&#xff0c;继承 UIViewController&#xff0c;将新建的 ViewController 绑定到 NewViewController 类上。现在 stor…

提防Java中的函数式编程!

这对函数式编程并不会造成太大的影响&#xff0c;这真棒。 这是关于某些实践的警告&#xff0c;您很可能会将其应用于您的代码&#xff0c;而这完全是错误的&#xff01; 。 高阶函数对于函数式编程是必不可少的&#xff0c;因此&#xff0c;谈论它们将帮助您成为聚会中的焦点…

LoadRunner脚本增强技巧之检查点

检查点的设置理解起来非常简单&#xff0c;就是要在服务器返回的页面中检查是否存在关键信息。检查点函数的错误会导致整个脚本运行结果的失败&#xff0c;通过这个功能可以方便地定位脚本运行中的逻辑错误。检查点的设置通常分为两种&#xff0c;一种是对文字的检查&#xff0…

苹果app商品定价_App Store 即将进行价格调整

当税率或外汇汇率变化时&#xff0c;我们有时需要更新 App Store 中的价格。即日起&#xff0c;巴基斯坦、哥伦比亚和台湾 App Store 中的产品价格(不包括自动续期订阅)将会上调。此次价格上调基于以下税率变化&#xff1a;• 哥伦比亚&#xff1a;自 2019 年 1 月 1 日起开始实…

es2016

对象解构 http://www.jb51.net/article/70140.htm 转载于:https://www.cnblogs.com/oneboi/p/7092847.html

hibernate 排序_Hibernate提示:排序和排序

hibernate 排序让我们介绍另一个Hibernate性能提示。 你还记得以前的Hibernate的模式后 &#xff1f; 我们有一个与一对多协会有关的星际飞船和军官。 Entity public class Starship {Id GeneratedValue(strategyGenerationType.SEQUENCE) private Long id;public Long getId()…

苏宁大数据怎么运营_苏宁云商“三驾马车”:大数据、大物流、大金融并行

(赢商网1月15日报道)随着“未来的零售企业是线上线下的完美融合”这一趋势的走红&#xff0c;2013年年初苏宁电器决定更名为“苏宁云商”&#xff0c;而在更名之后&#xff0c;公司的转型步伐一直在不断加快&#xff0c;行动力也令业界为之刮目相看。“大物流”模式今日&#x…

VueJS组件之全局组件与局部组件

全局组件 所有实例都能用全局组件。 HTML <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title> <script src"https://cdn.bootcss.com/vue/2.2.2/vue.min.js&quo…

Spark简介,您的下一个REST Java框架

希望今年您对Java的热情很高&#xff01; 今天&#xff0c;我们将研究一个清新&#xff0c;简单&#xff0c;美观且实用的框架&#xff0c;以Java编写REST应用程序。 它将非常简单&#xff0c;甚至根本不会看起来像Java。 我们将研究Spark Web框架。 不&#xff0c;它与Apache…

jq的插件 vue中引用_详解如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件

本篇文章主要介绍了详解如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件&#xff0c;具有一定的参考价值&#xff0c;有兴趣的可以了解一下使用vue-cli构建的vue项目&#xff0c;webpack的配置文件是分散在很多地方的&#xff0c;而我们需要修改的是build/webpack.base…

SQL Search

Press TAB to expand wildcard tab键之后&#xff0c;会自动展开&#xff0c;直接枚举表中所有的字段 根据名字查找存储过程&#xff0c;发现找不到 原因是&#xff0c;本地是一个备份库。服务器上通过sql source control进行版本控制的。 在通过sql source control将服务器上新…

Java日期工具类

Java日期工具类对日期格式进行转化&#xff0c;例如&#xff0c;将2018-12-13转化成20181213&#xff0c;也可以反过来。 package main.java.utils;import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date;public class DateUtil {/*** …

两个数组合成一个json对象_两个jsonarray合并

技术文档主体内容&#xff1a;可以认为是页面最想表达的内容总和。对于内容详情页来说&#xff0c;主体内容指从标题开始至正文内容结束&#xff0c;翻页区域也被视为主体内容&#xff0c;文章后的评论、分享、推荐等不视为主体内容。首屏&#xff1a;用户点击搜索结果后进入移…

04_传智播客iOS视频教程_类是以Class对象存储在代码段

1231312转载于:https://www.cnblogs.com/ZHONGZHENHUA/p/7097077.html

drools的guvnor_Drools Guvnor –管理访问

drools的guvnor外部化业务或技术规则对于可伸缩应用程序非常重要&#xff0c;但是应该管理BRMS服务访问。 guvnor使用基于角色的授权提供控件UI访问和操作。 在drools-guvnor参考手册中列出了几种权限类型。 具有所有权限的管理员。 分析师或只读分析师&#xff1a;特定类别的分…