以下是使用Spark连接MySQL数据库、添加数据和读取数据的步骤(基于Scala API):
- 准备工作
- 添加MySQL驱动依赖
在Spark项目中引入MySQL Connector JAR包(如 mysql-connector-java-8.0.33.jar ),或通过Spark提交命令指定:
bash
spark-submit --jars mysql-connector-java-8.0.33.jar your_app.jar
- 确保MySQL服务运行
确认数据库、表存在,且Spark所在节点可访问MySQL端口(默认3306)。
- 读取MySQL数据
scala
import org.apache.spark.sql.SparkSession
val spark = SparkSession.builder()
.appName("Spark MySQL Example")
.master("local[*]") // 或集群地址
.getOrCreate()
// 读取参数配置
val jdbcUrl = "jdbc:mysql://localhost:3306/test_db?useSSL=false&useUnicode=true&characterEncoding=utf8"
val table = "users" // 表名
val user = "root"
val password = "your_password"
// 读取数据为DataFrame
val df = spark.read.format("jdbc")
.option("url", jdbcUrl)
.option("dbtable", table)
.option("user", user)
.option("password", password)
.load()
// 显示数据
df.show()
- 写入数据到MySQL
scala
// 假设已有待写入的DataFrame(如dfToSave)
val writeMode = "append" // 写入模式:append(追加)、overwrite(覆盖)、ignore(忽略重复)、errorIfExists(冲突报错)
dfToSave.write.format("jdbc")
.option("url", jdbcUrl)
.option("dbtable", "new_users") // 目标表名
.option("user", user)
.option("password", password)
.option("driver", "com.mysql.cj.jdbc.Driver") // 驱动类(可选,Spark会自动推断)
.mode(writeMode)
.save()
关键参数说明
-
jdbcUrl :MySQL连接URL,需指定数据库名和字符编码(避免中文乱码)。
-
dbtable :支持直接写表名,或子查询(如 "(SELECT * FROM users WHERE age > 18) AS subquery" )。
-
writeMode :控制写入行为,根据需求选择模式。
注意事项
-
驱动版本匹配:确保MySQL驱动版本与数据库版本兼容(如MySQL 8.0+对应 mysql-connector-java 8.0+ )。
-
分区并行读取:若数据量大,可添加 partitionColumn 、 lowerBound 、 upperBound 参数并行读取:
scala
.option("partitionColumn", "id") // 分区字段(需为数字类型)
.option("lowerBound", "1") // 分区最小值
.option("upperBound", "1000") // 分区最大值
.option("numPartitions", "4") // 分区数(并行度)
- 事务支持:MySQL JDBC写入不保证事务原子性,大规模写入建议使用批量操作或外部工具(如Sqoop)。
通过以上代码,可实现Spark与MySQL的数据交互。