如何防止谓词下推?

时间:2018-05-14 17:57:12

标签: apache-spark apache-spark-sql

最近我和Spark一起使用JDBC数据源。请考虑以下代码段:

val df = spark.read.(options).format("jdbc").load();
val newDF = df.where(PRED)

PRED是一个谓词列表。

如果PRED是一个简单的谓词,如x = 10,则查询速度会快得多。但是,如果存在某些非等同条件,例如date > someOtherDate or date < someOtherDate2,则查询比没有谓词下推要慢得多。您可能知道,数据库引擎扫描这些谓词非常慢,在我的情况下甚至慢了10倍(!)。

为了防止不必要的谓词下推,我使用了:

val cachedDF = df.cache()
val newDF = cachedDF.where(PRED)

但它需要大量内存,并且 - 由于此处提到的问题 - Spark' Dataset unpersist behaviour - 我无法解决cachedDF

还有其他选项可以避免推断谓词吗?没有缓存而没有编写自己的数据源?

注意:即使有关闭谓词下推的选项,它也只适用于其他查询仍然可以使用它。所以,如果我写道:

// some fancy option set to not push down predicates
val df1 = ...
// predicate pushdown works again
val df2 = ...
df1.join(df2)// where df1 without predicate pushdown, but df2 with

1 个答案:

答案 0 :(得分:2)

已针对此问题打开了JIRA票证。你可以在这里关注它: https://issues.apache.org/jira/browse/SPARK-24288