apache-spark - 在 Spark SQL 中加入分区以获得更好的性能
问题描述
我是 Spark SQL 的新手。我对加入期间的分区使用有疑问
假设有一个名为test1
保存在10
分区(镶木地板)文件上的表。也假设spark.sql.shuffle.partitions = 200
.
问题:如果 test1 用于Join
另一个表,Spark 将使用10
分区(即表所在的分区数)执行操作,还是会在分区中重新分区表200
(根据 shuffle 分区值)然后执行加入 ?在这种情况下,连接将产生更好的性能。如果答案是连接将使用10
分区执行,那么总是CLUSTER BY
将连接表重新分区()到更多数量的分区以获得更好的连接性能不是更好吗?
在 Spark UI 中,我看到了一些stages
using only 10
tasks
,而其他stages
using200
任务。
有人可以帮我理解吗。
谢谢
解决方案
Spark 将读取 10 个任务的 10 个分区中的数据,类似地,它会读取连接中使用的其他数据帧分区,一旦它拥有所有数据,它将创建 200 个分区,这是随机分区的默认值。所以这就是为什么你在一个阶段看到 10 个任务,然后在不同阶段看到其他一些任务,最后在 shuffle 操作后看到 200 个任务。所以最后加入后,默认情况下您将拥有 200 个分区,除非您在 spark 配置中将其设置为不同的值。
推荐阅读
- php - 错误:不推荐使用 __autoload(),请改用 spl_autoload_register()
- mysql - 使用 JSON 数据类型的 Mysql JSON 嵌套数组
- java - 如何在 Android 中使通用数组列表可打包?
- .net-core - 使用带有 DynamoDB 的 .Net 核心使用文档模型或对象持久性模型获取最后插入的项目
- tensorflow - 使用 Keras 动态展开简单神经网络
- sql - 基于条件的运行总计
- c# - 使用 c# 限制用户在 Teams 对话中回复
- lua - 罗技游戏软件子配置文件脚本
- kubernetes - 如何确定 kubernetes pod 临时存储请求和限制?
- reactjs - React 中的 forwardingRef 和回调 ref 有什么区别?