如何设置spark jdbc选项以确保将过滤谓词下推到数据库而不是先加载所有内容?我使用的是火花2.1。无法使用正确的语法,我知道我可以在where
之后添加load()
子句,但这显然会先加载所有内容。我尝试下面但是这个过滤器在我的数据库客户端运行时需要几秒钟,它不会返回任何东西,只是在尝试从spark jdbc下推谓词时继续运行。
val jdbcReadOpts = Map(
"url" -> url,
"driver" -> driver,
"user" -> user,
"password" -> pass,
"dbtable" -> tblQuery,
"inferSchema" -> "true")
val predicate = "DATE(TS_COLUMN) = '2018-01-01'"
// Also tried -> val predicate = "SIMPLEDATECOL = '2018-01-01'"
val df = spark.read.format("jdbc")
.options(jdbcReadOpts)
.load().where(predicate)
答案 0 :(得分:0)
我知道我可以在load()之后添加一个where子句,但这显然会先加载所有内容。
事实并非如此。 where
中使用的谓词可以被推下,(并非每个谓词都可以,基于函数的谓词作为最明显的例子)会被自动推送。请注意,在某些情况下,缓存可能会影响谓词下推。
要按下限制,聚合和非平凡谓词,您可以使用查询字符串:Does spark predicate pushdown work with JDBC?。
答案 1 :(得分:0)
根据ParquetFilters.scala源代码,只允许将以下类型作为谓词过滤器下推。
BooleanType,IntegerType,LongType,FloatType,DoubleType,BinaryType
我发现these links对了解此功能很有用。