最近我和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