如果 where 子句已经修复,如何加快 spark sql 过滤器查询?

Posted

技术标签:

【中文标题】如果 where 子句已经修复,如何加快 spark sql 过滤器查询?【英文标题】:How to speed up spark sql filter queries if the where clause is already fixed? 【发布时间】:2021-12-30 15:47:47 【问题描述】:

在我的例子中,数据驻留在火花表中,这些表是通过在数据帧上调用 createOrReplaceTempView API 创建的。创建表后,将在表顶部运行几个查询。大多数时候,where 查询将基于特定列。相关列的名称是已知的。我想知道是否可以进行某种优化来提高过滤器查询的性能。 我尝试探索索引方法,但结果表明 spark 不支持索引特定列。

【问题讨论】:

【参考方案1】:

您是否查看过 SPARK 用户界面以了解您的大部分时间都花在了哪些地方?真的是大部分时间都花在了查询上吗?通常从磁盘读取数据是花费大部分时间的地方。学习阅读 SPARK UI 并找出真正的瓶颈所在。 SQL 选项卡是一个非常好的开始解决问题的方法。

以下是适用于大多数工作的在 spark 中运行得更快的一些技巧:

您能否重新定义问题?您使用的数据格式是否有助于您解决查询?你能改变它的写法来改变问题吗? (您是否可以在查询数据之前开始“预先咀嚼”数据以将其以最佳格式存储以帮助您解决要解决的问题?)大多数性能提升来自更改问题的参数以使它们更容易/更快地解决。

你是什么格式(是传入的数据) 将数据存储在其中?您使用的是 Parquet/Orc 吗?他们有很大的回报磁盘空间/压缩值得使用。他们还可以启用文件级过滤器以快速读取。您可以将他们的转换工作推向上游以帮助减少查询工作吗?您可以通过有助于查找的分区模式写入数据吗?

您的输入有多少个文件?您能否合并文件以最大限度地提高读取吞吐量。读取/列出大量小文件作为输入会减慢数据处理速度。

如果 tempView 查询的大小每次都相似,您可以考虑调整分区计数,使文件更小,但与 HDFS 块大小大致相同。 (假设您使用的是 hdfs)。 HDFS 你必须读取整个块天气你是否使用了所有数据。尝试将其应用于您的多个执行者,以便您一起完成而不是散乱。这很难做到完美,但您可以大步前进以找到合适的比例。

【讨论】:

【参考方案2】:

无需使用 spark 优化过滤条件。 spark 已经足够聪明,可以优化它的条件 post where 查询首先获取最小行。如果一次又一次地查询同一个视图,我猜你能做的最好的事情就是坚持你的 TempView。

【讨论】:

以上是关于如果 where 子句已经修复,如何加快 spark sql 过滤器查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复程序中的“歧义”where子句

如何修复where子句中的聚合?

VBA SQL 缺少 WHERE 子句的最后一个条件

WHERE子句不使用空值

Mysql InnoDB 视图变得缓慢并且不使用 Where 子句

如何使用替换 Where 子句实现以下火花行为