如何将java Resultset转换为Spark数据帧

时间:2017-08-04 17:43:22

标签: apache-spark dataframe jdbc teradata

我正在尝试使用JDBC的preparestatement。它导致ResultSet对象。我想将其转换为spark数据帧。

object JDBCRead {

val tableName:String = "TABLENAME"
val url :String = "jdbc:teradata://TERADATA_URL/user=USERNAME,password=PWD,charset=UTF8,TYPE=FASTEXPORT,SESSIONS=10"
val  selectTable:String  = "SELECT * FROM " + tableName +" sample 10";

 val con : Connection = DriverManager.getConnection(url);


 val pstmt2: PreparedStatement = con.prepareStatement(selectTable)

import java.sql.ResultSet

val rs: ResultSet = pstmt2.executeQuery



val rsmd: ResultSetMetaData = rs.getMetaData
while(rs.next()!=null)
{
  val k: Boolean = rs.next()
  for(i<-1 to rsmd.getColumnCount) {
    print(" " + rs.getObject(i))
  }
  println()
}

}

我想从Spark Dataframe调用上面的代码,以便我可以将数据加载到数据框中,并以分布式更快地获得结果。

我必须使用PreparedStatement。我无法使用spark.jdbc.load,因为Teradata的FASTEXPORT不能与jdbc加载一起使用。它必须与PreparedStatement

一起使用

如何实现这一目标?如何将预表示与SELECT语句一起用于加载到Spark Dataframe。

1 个答案:

答案 0 :(得分:2)

-

  

AFAIK有两种选择可用于此类要求     1. DataFrame 2. JdbcRDD

我提供JdbcRDD(因为您对预备陈述非常具体)

compute方法中内部使用了prepareStatement。因此,您不需要创建连接并明确维护(容易出错)。

稍后您可以将结果转换为dataframe

对于速度,您可以配置其他参数。

JdbcRDD的示例代码用法如下..

import org.apache.log4j.{Level, Logger}
  import org.apache.spark.SparkContext
  import org.apache.spark.SparkContext.__
  import org.apache.spark.SparkConf
  import org.apache.spark.rdd.JdbcRDD
  import java.sql.{connection, DriverManager,ResultSet}


  object jdbcRddExample {
    def main(args: Array[String]) {

        // Connection String    
        VAL URL = "jdbc:teradata://SERVER/demo"
        val username = "demo"
        val password = "Spark"
        Class.forName("com.teradata.jdbc.Driver").newInstance
        // Creating & Configuring Spark Context
        val conf = new SparkConf().setAppName("App1").setMaster("local[2]").set("spark.executor.memory",1)
        val sc = new SparkContext(conf)
        println("Start...")
        // Fetching data from Database
        val myRDD = new JdbcRDD(sc,() => DriverManager.getConnection(url,username,password),
        "select first_name, last_name, gender from person limit ?,?",
        3,5,1,r => r.getString("last_name") + "," +r.getString("first_name"))
        // Displaying the content
        myRDD.foreach(println)
        // Saving the content inside Text File
        myRDD.saveAsTextFile("c://jdbcrdd")

        println("End...")
    }
  }