Spark系列 —— Spark访问读写MySQL

Spark API提供了两种并行读MySQL的方式。
 

1. 基于整型列设置并行度

先上代码,对着代码再做详细的解释:

def readByIntegralColumn(spark: SparkSession): Unit = {
    val options = Map(
        "url" -> "jdbc:mysql://host:3306/dbName", // jdbc的url
        "dbtable" -> "tableName", //MySQL表名
        "user" -> "userName", //用户名
        "password" -> "passwd", //密码
        "driver" -> "com.mysql.jdbc.Driver", //驱动
        "partitionColumn" -> "id", //被用来分区的整型列
        "lowerBound" -> "1", //要读取的整型列的下界(包含下界)
        "UpperBound" -> "400000", //要读取的整型列的上界(不包含上界)
        "numPartitions" -> "10" //分区数
    )

    spark.read
        .format("jdbc")
        .options(options)
        .load()
        .write
        .saveAsTable("dbName.tableName")
}

上面代码中,要读取MySQL中id值从1到400000的行,并划分10个分区,每个分区平均读取40000条记录。
 

2. 基于范围设置并行度

同样先上代码,对着代码再做详细的解释:

def readByRange(spark: SparkSession): Unit = {
	//用户名和密码
    val prop = new Properties()
    prop.put("user", "userName")
    prop.put("password", "passwd")

    val url = "jdbc:mysql://host:3306//dbName" //url
    val table = "tableName" //表名

    //predicates参数就相当于在where表达式中的范围, 有几个范围就有几个分区进行并行读取
    val predicates = Array[String](
        "created_at < '2018-08-01 00:00:00'",
        "created_at >= '2018-08-01 00:00:00' && created_at < '2018-10-01 00:00:00'",
        "created_at >= '2018-10-01 00:00:00'")

    spark.read
        .jdbc(url, table, predicates, prop)
        .write.saveAsTable("dbName.tableName")
}

上面代码中,基于MySQL中记录的创建时间来划分分区,predicates中设置的范围区间数就是分区数。当然,也可以是使用其他任何可以进行区间查询的列来设置分区数。

注意:不要在集群上并行创建太多分区,否则可能会给MySQL产生很大的访问压力,甚至可能会导致数据库系统崩溃

你可能感兴趣的:(Spark)