Spark SQL为JDBC查询生成错误的上限和下限

时间:2017-12-07 17:36:21

标签: java apache-spark apache-spark-sql

所以我目前正在使用Spark-SQL进行POC我需要使用spark中的spark-sql查询并行化读取操作

 JavaRDD<Row> dataset = sqlContext.read().jdbc(jdBcConnectionString, getSqlQuery(), "tran_id"
                lowerbound, upperbound, partitions, props).toJavaRDD();

每一个看起来都很好并且工作正常,直到你检查生成的查询(在我自己的情况下是MS Sql Server)。

下限查询是

exec sp_executesql N'SELECT * FROM table_name WHERE tran_id < 770425 or post_tran_id is null'

而上限查询变为

exec sp_executesql N'SELECT * FROM table_name WHERE tran_id >= 770425'

有人会认为指定边界的本质是获取列值在指定的下限和上限之间的所有行。但似乎并非如此

请问我是新来的火花,有没有另外一种方法可以实现这个目标

1 个答案:

答案 0 :(得分:2)

  

有人会认为指定边界的本质是获取列值在指定的下限和上限之间的所有行。

不是,条件是正确的。像往常一样,阅读文档比假设更好:

  

请注意,lowerBound和upperBound仅用于决定分区步幅,而不是用于过滤表中的行。因此,表中的所有行都将被分区并返回。此选项仅适用于阅读。

但在您的情况下,lowerBound似乎等于upperBound

  

请问我是新来的火花,有没有另外一种方法可以实现这个目标

如果您想要过滤,请应用where

dataset.where(col("tran_id").between(lowerBound, upperBound))

或使用子查询作为表参数:

sqlContext.read().jdbc(
  jdBcConnectionString,
  "(SELECT * FROM table_name WHERE tran_id BETWEEN 0 AND 42) AS t", props);