Spark JDBC对接SQL Server设置pushDownPredicate=false后filter查询仍报错排查
Spark JDBC
pushDownPredicate 配置失效问题解答 核心原因:参数配置方式错误
你目前的配置方式不生效,是因为pushDownPredicate属于Spark JDBC数据源的专属配置项,不是JDBC连接驱动的属性,你将其写入Properties传入spark.read.jdbc方法时,这个参数只会被当作连接属性传给SQL Server驱动,不会被Spark的JDBC数据源识别,因此谓词下推逻辑依然默认开启,才会触发Dialect的布尔值转换缺陷,报相同的错误。
pushDownPredicate 正确配置方式
需要通过option方法单独指定数据源参数,示例代码如下:
val df = spark.read .option("url", "jdbc:sqlserver://XXXXXX") .option("dbtable", "movies") .option("pushDownPredicate", "false") // 正确配置谓词下推关闭 .load() df.filter("rated == true").show()
pushDownPredicate 实际工作逻辑
- 默认值为
true:Spark会将所有支持下推的过滤谓词转换为对应数据源的SQL WHERE子句,直接在数据库端执行过滤,减少拉取到Spark侧的数据量,此时会调用对应Dialect的compileValue方法生成适配的SQL语法 - 设置为
false:Spark不会生成任何下推到数据源的过滤条件,会先拉取全表数据到Spark内存,再在Spark侧执行所有过滤逻辑,此时不会涉及数据库端的SQL生成,自然也不会触发SQL Server布尔值转换的报错
临时解决方案(二选一即可)
- 按上述正确方式配置
pushDownPredicate=false,让过滤逻辑全部在Spark侧执行,规避Dialect的语法转换缺陷 - 调整过滤条件写法,直接用SQL Server bit类型适配的数值匹配:
df.filter("rated == 1").show(),这种写法即使谓词下推开启也能正常执行
内容的提问来源于stack exchange,提问作者Xiaojin Wang
相关产品推荐
相关产品推荐

