首页 > 解决方案 > 通过 CLUSTER 提高 SparkSQL 查询性能

问题描述

我是新手,SparkSQL主要从事编写SparkSQL查询的工作。我们经常需要JOIN在查询中使用大表,并且很快就会遇到与它们相关的性能问题(例如Joinsaggregates等)。

在网上搜索补救措施时,我最近遇到了术语 - COALESCE()REPARTITION()、等DISTRIBUTE BYCLUSTER BY以及它们可能用于提高运行缓慢的SparkSQL 查询的性能这一事实。

不幸的是,我找不到足够的例子来让我清楚地理解它们并开始将它们应用到我的查询中。我主要是在寻找解释它们的语法、提示和使用场景的例子。

任何人都可以在这里帮助我并提供SparkSQL其用法和何时使用它们的查询示例吗?例如

注意:我只能访问编写SparkSQL查询,但无权访问PySpark-SQL.

任何帮助深表感谢。谢谢

标签: apache-spark-sql

解决方案


合并

coalesce(expr1, expr2, ...) - 如果存在,则返回第一个非空参数。否则为空。

例子:

选择合并(NULL,1,NULL);1 自:1.0.0

分发者和修复

通过给定的表达式重新分区 DataFrame。分区数等于 spark.sql.shuffle.partitions。请注意,在 Spark 中,当一个 DataFrame 被某个表达式分区时,该表达式相等的所有行都在同一个分区上(但不一定反之亦然)!这就是它在实践中的样子。假设我们有一个包含两列的 DataFrame:键和值。

SET spark.sql.shuffle.partitions = 2
SELECT * FROM df DISTRIBUTE BY key
等效于 DataFrame API:

df.repartition($"key", 2)

聚类依据

这只是在同一组表达式上一起使用分发和排序的快捷方式。在 SQL 中:

SET spark.sql.shuffle.partitions = 2
SELECT * FROM df CLUSTER BY key


推荐阅读