通过 CLUSTER 提高 SparkSQL 查询性能

Posted

技术标签:

【中文标题】通过 CLUSTER 提高 SparkSQL 查询性能【英文标题】:SparkSQL Query performance improvement by CLUSTER By 【发布时间】:2020-06-05 18:26:43 【问题描述】:

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

在网上搜索补救措施时,我最近遇到了一些术语 - COALESCE()REPARTITION()DISTRIBUTE BYCLUSTER BY 等,而且它们可能用于增强运行缓慢SparkSQL 查询的性能。

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

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

语法 提示语法 提示 场景

注意:我只能写SparkSQL查询,但没有可以访问PySpark-SQL

非常感谢任何帮助。 谢谢

【问题讨论】:

【参考方案1】:

合并

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 DataFrame API 中的等价物:

df.repartition($"key", 2)

聚类依据

这只是在同一组表达式上同时使用distribute by 和sort by 的快捷方式。 在 SQL 中:

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

【讨论】:

以上是关于通过 CLUSTER 提高 SparkSQL 查询性能的主要内容,如果未能解决你的问题,请参考以下文章

关于sparksql中的hint

SparkSQL 子查询和性能

大数据SparkSql连接查询中的谓词下推处理

SparkSQL 时间戳查询失败

SparkSQL 列查询不显示列内容?

通过 Spark SQL 查询 Cassandra UDT