使用Scala 读写MySQL 数据给Spark任务执行

来源:互联网 发布:最好背单词软件 编辑:程序博客网 时间:2024/06/05 06:02

初学Spark,需要从数据库读取数据给Spark执行,然后将执行结果返回给数据库。

由于Spark是基于 Scala 开发的,刚开始完全摸不到头脑,本来是用java将数据库数据写到一个文件,然后spark去读这个文件然后执行,又突然想到,既然scala写的spark程序,何不用scala来直接读取数据库给spark任务执行,然后返回给数据库就行了啊,还绕那么多弯干嘛。。

虽然不会写Scala,但是会写 Java啊,于是照葫芦画瓢,连接JDBC,将数据存到集合然后计算即可。

开始用的List, 但是Scala的List类型是不可变的,immutable,
A class for immutable linked lists representing ordered collections of elements of type.

于是看看有没有可变集合,找到一个scala.collection.mutable.ArrayBuffer,可用。

package wordcountimport org.apache.spark.{SparkConf, SparkContext}import java.sql.{Connection, DriverManager, ResultSet};import scala.collection.mutable.ArrayBuffer/**  * Created by kay on 2017/12/13.  */object WordCountLocal {  // Change to Your Database Config  val conn_str = "jdbc:mysql://localhost:3306/mydb?user=root&password=root";  def main(args: Array[String]): Unit = {    // Load the driver    classOf[com.mysql.jdbc.Driver]    // Setup the connection    val conn = DriverManager.getConnection(conn_str)    val arrayBuffer = ArrayBuffer[String]()    try {      // Configure to be Read Only      val statement = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)      // Execute Query      val rs = statement.executeQuery("SELECT name FROM table1")      // Iterate Over ResultSet      while (rs.next) {        arrayBuffer+=rs.getString("name")      }    }    finally {      conn.close    }    execute(arrayBuffer)  }  def execute(arrayBuffer:ArrayBuffer[String]): Unit ={    // Load the driver    classOf[com.mysql.jdbc.Driver]    val conf = new SparkConf().setAppName("testWord").setMaster("local[4]")    val sc = new SparkContext(conf)    val stringRDD=sc.parallelize(arrayBuffer)    val conn1 = DriverManager.getConnection(conn_str)    try {      for ((key,count) <- stringRDD.map((_, 1)).reduceByKey(_ + _).collect()) {        val prep = conn1.prepareStatement("INSERT INTO result (word, count) VALUES (?, ?) ")        prep.setString(1, key)        prep.setInt(2, count)        prep.executeUpdate      }    }finally {      conn1.close()    }  }}