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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark SQL为JDBC查询生成错误的上限和下限相关的知识,希望对你有一定的参考价值。

所以我目前正在使用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'

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

请问我是新来的火花,还有另一种方法来实现这一点

答案

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

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

请注意,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);

以上是关于Spark SQL为JDBC查询生成错误的上限和下限的主要内容,如果未能解决你的问题,请参考以下文章

获取 PSQLException:错误:在带有 Postgres 的 spark jdbc 中使用查询而不是表名时在“SELECT”处或附近出现语法错误

如何通过 Spark SQL 作为 JDBC 分布式查询引擎访问 RDD 表?

使用 java Spark DataFrame 通过 jdbc 访问 Oracle

Hibernate/JDBC 为 Informix 数据库生成错误的 SQL

Spark sql 查询优化

将 spark 应用程序连接到远程 sql 服务器时出现 jdbc 连接超时错误