spark中jdbcRDD操作mysql的用法

本文介绍如何在Spark中使用JdbcRDD连接MySQL数据库进行数据查询操作。通过实例演示了设置SparkConf、创建SparkContext、定义连接函数、执行SQL查询及收集结果的过程。

spark中提供了jdbcRDD连接mysql数据库操作

import java.sql.DriverManager
import org.apache.spark.rdd.JdbcRDD
import org.apache.spark.{SparkConf, SparkContext}

object JdbcRDDDemo {
  def main(args: Array[String]): Unit = {
    //1.spark程序入口
    val conf: SparkConf = new SparkConf().setAppName("Urlcount").setMaster("local[2]")
    val sc: SparkContext = new SparkContext(conf)

    //匿名函数
    val connection =() =>{
      Class.forName("com.mysql.jdbc.Driver").newInstance()
      DriverManager.getConnection("jdbc:mysql://localhost:3306/urlcount?charatorEncoding=utf-8","root","root")


    }

    //查询数据
    val jdbcRdd: JdbcRDD[(Int,String,String)] = new JdbcRDD(
      //指定sparkcontext
      sc,
      connection,
      "SELECT * FROM url_data where uid >= ? AND uid <= ?",
      //两个任务并行 ,其中1,4代表上面sql语句中的两个占位符? ?,如果定义两个分区,
      //最好使用>= <=  而不是> <,否则容易导致一些结果丢失
      1, 4, 2,
      r => {
        val uid = r.getInt(1)
        val xueyuan = r.getString(2)
        val number_one = r.getString(3)
        (uid,xueyuan,number_one)
      }
    )

    val jrdd = jdbcRdd.collect()
    println(jrdd.toBuffer)
    sc.stop()
  }
}
<think>我们被要求提供使用Spark读写MySQL数据库的方法。根据用户之前的请求,他可能已经了解HBase的读写方法,现在转向关系型数据库MySQL。我们将结合引用内容,特别是引用[1][3][4]中关于MySQL操作,提供完整的Spark读写MySQL指南。 ## Spark读写MySQL数据库方法指南 ### 一、环境准备 #### 1.1 添加MySQL驱动依赖 ```xml <!-- Maven依赖 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> <!-- 版本需MySQL服务器版本匹配 --> </dependency> ``` #### 1.2 配置SparkSession ```scala import org.apache.spark.sql.SparkSession val spark = SparkSession.builder() .appName("Spark MySQL Example") .master("local[*]") .config("spark.sql.warehouse.dir", "/user/hive/warehouse") .getOrCreate() ``` ### 二、读取MySQL数据 #### 2.1 使用DataFrame API读取(推荐) ```scala val jdbcDF = spark.read .format("jdbc") .option("url", "jdbc:mysql://localhost:3306/testdb") .option("dbtable", "employees") .option("user", "root") .option("password", "mypassword") .option("driver", "com.mysql.jdbc.Driver") // 驱动类 .load() jdbcDF.show() ``` #### 2.2 自定义查询读取 ```scala val queryDF = spark.read .format("jdbc") .option("url", "jdbc:mysql://localhost:3306/testdb") .option("query", "SELECT name, salary FROM employees WHERE salary > 5000") .option("user", "root") .option("password", "mypassword") .option("driver", "com.mysql.jdbc.Driver") .load() ``` #### 2.3 分区读取(大数据量优化) ```scala val partitionedDF = spark.read .format("jdbc") .option("url", "jdbc:mysql://localhost:3306/testdb") .option("dbtable", "employees") .option("user", "root") .option("password", "mypassword") .option("driver", "com.mysql.jdbc.Driver") .option("numPartitions", 10) // 设置分区数 .option("partitionColumn", "id") // 分区列(必须是整数类型) .option("lowerBound", 1) // 分区列最小值 .option("upperBound", 100000) // 分区列最大值 .load() ``` ### 三、写入MySQL数据 #### 3.1 基础写入方法 ```scala import org.apache.spark.sql.SaveMode val data = Seq( ("Alice", 28, 8000), ("Bob", 32, 7500) ) val df = spark.createDataFrame(data).toDF("name", "age", "salary") df.write .format("jdbc") .option("url", "jdbc:mysql://localhost:3306/testdb") .option("dbtable", "employees") .option("user", "root") .option("password", "mypassword") .option("driver", "com.mysql.jdbc.Driver") .mode(SaveMode.Append) // 保存模式:覆盖/追加等 .save() ``` #### 3.2 批量写入优化 ```scala df.write .format("jdbc") .option("url", "jdbc:mysql://localhost:3306/testdb") .option("dbtable", "employees") .option("user", "root") .option("password", "mypassword") .option("driver", "com.mysql.jdbc.Driver") .option("batchsize", 10000) // 每批次写入记录数 .mode(SaveMode.Overwrite) .save() ``` ### 四、性能优化技巧 1. **连接池配置**:使用HikariCP等连接池减少连接开销 2. **行读取**:通过`numPartitions`和`partitionColumn`实现行读取 3. **写入批处理**:调整`batchsize`参数(默认1000) 4. **数据类型映射**:确保SparkMySQL数据类型正确匹配 5. **事务隔离级别**:对于写入操作可设置`isolationLevel`参数 ### 五、常见问题解决 1. **驱动未找到**: - 确保驱动jar包在classpath中 - 提交作业时添加`--jars mysql-connector-java-8.0.28.jar` 2. **时区问题**: ```scala .option("connectionTimeZone", "UTC") // 设置连接时区 ``` 3. **SSL警告**: ```scala .option("useSSL", "false") // 测试环境禁用SSL ``` ### 六、完整示例(Zeppelin环境) 参考引用[4]中的Zeppelin示例: ```scala %spark // 读取数据 val df = spark.read.format("jdbc") .option("url","jdbc:mysql://192.134.216.130:3306/dw") .option("dbtable","stu_info") .option("user","root") .option("password","123456!a") .load() .select("id","name","sex") .withColumn("id",col("id")+1) // 写入数据 df.write.format("jdbc") .option("url","jdbc:mysql://192.134.216.130:3306/dw") .option("dbtable","stuinfo") .option("user","root") .option("password","123456!a") .mode(SaveMode.Append) .save() ``` > **注意**:实际应用中需根据MySQL版本选择匹配的驱动版本(MySQL 5.x建议使用5.1.x驱动,MySQL 8.x使用8.0.x驱动)[^3]。 §§相关问题§§ 1. 如何解决Spark读取MySQL时的数据类型转换问题? 2. Spark写入MySQL时如何实现幂等操作? 3. 如何监控SparkMySQL的数据传输性能? 4. Spark SQL如何直接执行MySQL原生查询? 5. 使用Kerberos认证时如何配置Spark连接MySQL? </think> # Spark读写MySQL数据库数据指南 下面我将详细介绍Spark读写MySQL数据库的完整方法,涵盖数据读取、写入和性能优化技巧。 ## 一、环境准备 ### 1.1 添加MySQL驱动依赖 ```xml <!-- Maven依赖 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> <!-- 版本需MySQL服务器版本匹配 --> </dependency> ``` ### 1.2 创建SparkSession ```scala import org.apache.spark.sql.SparkSession val spark = SparkSession.builder() .appName("Spark MySQL Example") .master("local[*]") .config("spark.sql.warehouse.dir", "/user/hive/warehouse") .getOrCreate() ``` ## 二、读取MySQL数据 ### 2.1 基础读取方法 ```scala val jdbcDF = spark.read .format("jdbc") .option("url", "jdbc:mysql://localhost:3306/testdb") .option("dbtable", "employees") .option("user", "root") .option("password", "mypassword") .option("driver", "com.mysql.jdbc.Driver") // 驱动类 .load() jdbcDF.show() ``` ### 2.2 分区读取(大数据量优化) ```scala val partitionedDF = spark.read .format("jdbc") .option("url", "jdbc:mysql://localhost:3306/testdb") .option("dbtable", "employees") .option("user", "root") .option("password", "mypassword") .option("driver", "com.mysql.jdbc.Driver") .option("numPartitions", 10) // 设置分区数 .option("partitionColumn", "id") // 分区列(必须是整数类型) .option("lowerBound", 1) // 分区列最小值 .option("upperBound", 100000) // 分区列最大值 .load() ``` ### 2.3 自定义SQL查询 ```scala val queryDF = spark.read .format("jdbc") .option("url", "jdbc:mysql://localhost:3306/testdb") .option("query", "SELECT name, salary FROM employees WHERE salary > 5000") .option("user", "root") .option("password", "mypassword") .option("driver", "com.mysql.jdbc.Driver") .load() ``` ## 三、写入MySQL数据 ### 3.1 基础写入方法 ```scala import org.apache.spark.sql.SaveMode val data = Seq( ("Alice", 28, 8000), ("Bob", 32, 7500) ) val df = spark.createDataFrame(data).toDF("name", "age", "salary") df.write .format("jdbc") .option("url", "jdbc:mysql://localhost:3306/testdb") .option("dbtable", "employees") .option("user", "root") .option("password", "mypassword") .option("driver", "com.mysql.jdbc.Driver") .mode(SaveMode.Append) // 保存模式:覆盖/追加等 .save() ``` ### 3.2 批量写入优化 ```scala df.write .format("jdbc") .option("url", "jdbc:mysql://localhost:3306/testdb") .option("dbtable", "employees") .option("user", "root") .option("password", "mypassword") .option("driver", "com.mysql.jdbc.Driver") .option("batchsize", 10000) // 每批次写入记录数 .mode(SaveMode.Overwrite) .save() ``` ### 3.3 使用Spark SQL写入 ```scala // 注册为临时视图 df.createOrReplaceTempView("temp_employees") // 使用SQL写入 spark.sql( s""" CREATE TABLE employees USING org.apache.spark.sql.jdbc OPTIONS ( url 'jdbc:mysql://localhost:3306/testdb', dbtable 'employees', user 'root', password 'mypassword', driver 'com.mysql.jdbc.Driver' ) AS SELECT * FROM temp_employees """ ) ``` ## 四、性能优化技巧 1. **连接池配置**:使用HikariCP等连接池减少连接开销 2. **行读取**:通过`numPartitions`和`partitionColumn`实现行读取 3. **写入批处理**:调整`batchsize`参数(默认1000) 4. **数据类型映射**:确保SparkMySQL数据类型正确匹配 5. **事务隔离级别**:对于写入操作可设置`isolationLevel`参数 ```scala .option("isolationLevel", "READ_COMMITTED") // 控制事务隔离级别 ``` ## 五、常见问题解决 1. **驱动未找到**: - 确保驱动jar包在classpath中 - 提交作业时添加`--jars mysql-connector-java-8.0.28.jar` 2. **时区问题**: ```scala .option("connectionTimeZone", "UTC") // 设置连接时区 ``` 3. **SSL警告**: ```scala .option("useSSL", "false") // 测试环境禁用SSL ``` ## 六、完整示例(Zeppelin环境) 参考引用[4]中的Zeppelin示例: ```scala %spark // 读取数据 val df = spark.read.format("jdbc") .option("url","jdbc:mysql://192.134.216.130:3306/dw") .option("dbtable","stu_info") .option("user","root") .option("password","123456!a") .load() .select("id","name","sex") .withColumn("id",col("id")+1) // 写入数据 df.write.format("jdbc") .option("url","jdbc:mysql://192.134.216.130:3306/dw") .option("dbtable","stuinfo") .option("user","root") .option("password","123456!a") .mode(SaveMode.Append) .save() ``` > **注意**:实际应用中需根据MySQL版本选择匹配的驱动版本(MySQL 5.x建议使用5.1.x驱动,MySQL 8.x使用8.0.x驱动)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值