在Spark JDBC Properties中下推过滤谓词

时间:2018-01-03 18:12:26

标签: apache-spark jdbc

如何设置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)

2 个答案:

答案 0 :(得分:0)

  

我知道我可以在load()之后添加一个where子句,但这显然会先加载所有内容。

事实并非如此。 where中使用的谓词可以被推下,(并非每个谓词都可以,基于函数的谓词作为最明显的例子)会被自动推送。请注意,在某些情况下,缓存可能会影响谓词下推。

要按下限制,聚合和非平凡谓词,您可以使用查询字符串:Does spark predicate pushdown work with JDBC?

答案 1 :(得分:0)

根据ParquetFilters.scala源代码,只允许将以下类型作为谓词过滤器下推。

BooleanType,IntegerType,LongType,FloatType,DoubleType,BinaryType

我发现these links对了解此功能很有用。