spark操作mysql数据库

spark对mysql提供了一些基本的读写操作,今天这边文章主要从读写两个方面来讲。

一、spark读取mysql数据库

1、通过JdbcRdd来读取

      首先看一下官方文档是如何介绍的

spark操作mysql数据库_第1张图片


翻译为:

1、getConnection 返回一个已经打开的结构化数据库连接,JdbcRDD会自动维护关闭。
2、sql 是查询语句,此查询语句必须包含两处占位符?来作为分割数据库ResulSet的参数,例如:"select title, author from books where ? < = id and id <= ?"
3、lowerBound, upperBound, numPartitions 分别为第一、第二占位符,partition的个数。例如,给出lowebound 1,upperbound 20, numpartitions 2,则查询分别为(1, 10)与(11, 20)
4、mapRow 是转换函数,将返回的ResultSet转成RDD需用的单行数据,此处可以选择Array或其他,也可以是自定义的case class。默认的是将ResultSet 转换成一个Object数组。

代码示例:

    val sc = new SparkContext("local", "mysql")
    val rdd = new JdbcRDD(
      sc,
      () => {
        Class.forName("com.mysql.jdbc.Driver").newInstance()
        DriverManager.getConnection("jdbc:mysql://localhost:3306/db", "root", "123456")
      },
      "SELECT content FROM mysqltest WHERE ID >= ? AND ID <= ?",
      1, 100, 3,
      r => r.getString(1)).cache()
 
    print(rdd.filter(_.contains("success")).count())


缺点:

只能用于查找符合ID >= ? AND ID <= ?这种形式的数据


2、通过SQLContext.read.jdbc来读取

看一下官方文档介绍

spark操作mysql数据库_第2张图片

翻译一下:

url:database的url,格式:jdbc:subprotocol:subname

table:表名

predicates:where条件

connectionProperties:数据库连接属性


代码示例:

val url="jdbc:mysql://localhost:3306/my_db"
val prop = new java.util.Properties
prop.setProperty("user","root")
prop.setProperty("password","123456)

#指定读取条件,这里 Array("gender=1") 是where过滤条件
val cnFlight = sqlContext.read.jdbc(url,"gps_location",Array("gender=1"),prop).select("id","name")


二、spark写入mysql数据库

spark1.3添加了DataFrame,可以方便的对表和数据进行操作。

createJDBCTable介绍:

url:数据库信息

table:表名

overwrite:是否覆盖之前数据


insertIntoJDBC介绍:

url:数据库信息

table:表名

allowExisting:如果表存在,是否删除之前表

看文档,我们可以看到,这个方法会执行一个create table和insert into 的过程,如果allowdExisting为true,则会删除之前的表,

示例如下:

import org.apache.spark.SparkContext
import org.apache.spark.sql.types.{IntegerType, StringType, StructField, StructType}
import org.apache.spark.sql.{Row, SQLContext}

/**
 * class description :
 * project_name:test.mysql
 * author:lucaifang
 * createTime:2016/7/18 17:11
 * updateTime:2016/7/18 17:11
 *
 */
object JdbcTest {
  def main(args: Array[String]) {
    val sc = new SparkContext
    val sqlContext = new SQLContext(sc)
    import sqlContext.implicits._

    val data = sc.parallelize(List((1,"name1"),(2,"name2"),(3,"name3"),(4,"name4"))).
      map(item=>Row.apply(item._1,item._2))

    val schema = StructType(StructField("id", IntegerType)::StructField("name", StringType):: Nil)
    val df = sqlContext.createDataFrame(data,schema)

    val url="jdbc:mysql://172.16.3.66:3306/data_kanban?user=root&password=dataS@baihe!"
    df.createJDBCTable(url, "table1", false)//创建表并插入数据
    df.insertIntoJDBC(url,"table1",false)//插入数据   false为不覆盖之前数据
  }
}


文章整理来自:http://www.iteblog.com/archives/1290

你可能感兴趣的:(spark+scala)