使用Spark JdbcRDD读取PostgreSQL表

时间:2017-06-16 13:27:46

标签: postgresql scala apache-spark jdbc rdd

我正在尝试将一个表从PostgreSQL 9.6读入一个RDD中的Spark 2.1.1,我在Scala中有以下代码。

import org.apache.spark.rdd.JdbcRDD
import java.sql.DriverManager
import org.apache.spark.SparkContext

val sc = SparkContext.getOrCreate()

val rdd = new org.apache.spark.rdd.JdbcRDD(
    sc,
    () => {DriverManager.getConnection(
    "jdbc:postgresql://my_host:5432/my_db", "my_user", "my_pass")},
    sql = "select * from my_table",
    0, 100000, 2)

但是,它返回以下错误:

  

org.apache.spark.SparkException:作业因阶段失败而中止:   阶段1.0中的任务0失败4次,最近失败:丢失任务0.3   在阶段1.0(TID 7,10.0.0.13,执行人1):   org.postgresql.util.PSQLException:列索引超出范围:   1,列数:0。

我正在使用最新的PostgreSQL JDBC驱动程序,我已经检查过它是否正确地验证了数据库。

为什么会发生这种情况或我可以尝试的任何其他选择?

1 个答案:

答案 0 :(得分:2)

来自spark documentation

  

查询必须包含两个?占位符,用于分区结果的参数

  

lowerBound第一个占位符参数的最小值; upperBound第二个占位符的最大值

因此,您的查询应该更像

select * from my_table where ? <= id and id <= ?