首页 > 解决方案 > 在 Spark SQL 中加入分区以获得更好的性能

问题描述

我是 Spark SQL 的新手。我对加入期间的分区使用有疑问

假设有一个名为test1保存在10分区(镶木地板)文件上的表。也假设spark.sql.shuffle.partitions = 200.

问题:如果 test1 用于Join另一个表,Spark 将使用10分区(即表所在的分区数)执行操作,还是会在分区中重新分区表200(根据 shuffle 分区值)然后执行加入 ?在这种情况下,连接将产生更好的性能。如果答案是连接将使用10分区执行,那么总是CLUSTER BY将连接表重新分区()到更多数量的分区以获得更好的连接性能不是更好吗?

在 Spark UI 中,我看到了一些stagesusing only 10 tasks,而其他stagesusing200任务。

有人可以帮我理解吗。

谢谢

标签: apache-sparkapache-spark-sql

解决方案


Spark 将读取 10 个任务的 10 个分区中的数据,类似地,它会读取连接中使用的其他数据帧分区,一旦它拥有所有数据,它将创建 200 个分区,这是随机分区的默认值。所以这就是为什么你在一个阶段看到 10 个任务,然后在不同阶段看到其他一些任务,最后在 shuffle 操作后看到 200 个任务。所以最后加入后,默认情况下您将拥有 200 个分区,除非您在 spark 配置中将其设置为不同的值。


推荐阅读