我正在尝试使用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。
答案 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...")
}
}