一、代碼
package com.sgcc.hj import java.sql.DriverManager import org.apache.spark.rdd.JdbcRDD import org.apache.spark.{SparkConf, SparkContext} /** * Created by user on 2016/6/17. */ object JdbcTest { def main(args: Array[String]) { val conf = new SparkConf() val sc = new SparkContext(conf) val rdd = new JdbcRDD( sc, () => { Class.forName("oracle.jdbc.driver.OracleDriver").newInstance() DriverManager.getConnection("jdbc:oracle:thin:@172.16.222.112:1521:pms", "scyw", "scyw") }, "SELECT * FROM MW_APP.CMST_AIRPRESSURE WHERE 1 = ? AND rownum < ?", 1, 10, 1, r => (r.getString(1),r.getString(2),r.getString(5))) rdd.collect().foreach(println) sc.stop() } }
二、運行截圖
命令:spark-submit --master yarn --jars /opt/test/data/oracle.jdbc_10.2.0.jar --name OracleRead --class com.sgcc.hj.JdbcTest--executor-memory 1G /opt/test/data/sparktest.jar(注意這里依賴了oracle的jar包要在加上)
三、答疑
1、官方文檔地址:
https://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.rdd.JdbcRDD
2、JdbcRdd中的構造參數:
前面三個就不解釋了,一眼就可以看懂,后面三個數字,前兩個表示SQL中的參數,必須是LONG型,而且必須有,這個是Spark源碼要求的,如果沒有LONG型的條件,可以使用1=1這種參數(第三個參數要為1);第三個參數表示分區查詢,例如給定前兩個參數為1和20,第三個參數為2,那么SQL就會執行兩次,第一次參數為(1, 10),第二次為(11, 20);最后一個參數是函數,這里表示把一條記錄里的第1、2、5個字段組成三元組,當然也可以變成別的形式。