使用Spark将DataFrame数据写入MySQL表的完整指南(含MySQL5.7强制安装记录)

使用 Spark 将 DataFrame 数据写入 MySQL 表的完整指南(含 MySQL 5.7 强制安装记录)

在大数据处理中,经常需要将数据从一个数据源转移到另一个数据源。本文将详细介绍如何使用 Spark 将 DataFrame 数据写入 MySQL 表,并记录 MySQL 5.7 强制安装过程及常见问题解决方法。

一、MySQL 5.7 强制安装记录

1. 问题背景

在 CentOS 系统中安装 MySQL 5.7 时,可能因 GPG 密钥验证失败或依赖冲突导致常规安装失败。此时需通过强制安装跳过验证,适用于测试环境或无法联网更新密钥的场景。

2. 强制安装命令

1
2
3
4
5
6
7
8
9
# 下载MySQL 5.7仓库配置包
sudo rpm -ivh mysql57-community-release-el7-11.noarch.rpm

# 强制安装MySQL服务器(跳过GPG检查和依赖验证)
sudo yum install mysql-community-server --nogpgcheck --force --nodeps

# 启动服务
sudo systemctl start mysqld
sudo systemctl enable mysqld

3. 安全风险提示

  • --nogpgcheck:跳过 GPG 签名验证,可能安装未经安全校验的包。
  • --force --nodeps:强制覆盖文件并忽略依赖,可能导致服务不稳定。
  • 仅建议测试环境使用,生产环境需通过官方渠道修复密钥或依赖问题。

二、环境准备

  • 操作系统:CentOS
  • 数据库:MySQL 5.7(强制安装)
  • 编程语言:Scala
  • 数据处理框架:Spark

三、创建 MySQL 表

在 MySQL 中创建school数据库及students表:

1
2
3
4
5
6
7
8
CREATE DATABASE IF NOT EXISTS school;
USE school;
CREATE TABLE IF NOT EXISTS students (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
gender VARCHAR(10) NOT NULL,
age INT NOT NULL
);

四、使用 Spark 写入数据到 MySQL

1. Spark Shell 启动命令(指定 MySQL 驱动)

1
2
3
4
cd /usr/local/spark
./bin/spark-shell \
--jars /usr/local/spark/jars/mysql-connector-java-5.1.40/mysql-connector-java-5.1.40-bin.jar \
--driver-class-path /usr/local/spark/jars/mysql-connector-java-5.1.40/mysql-connector-java-5.1.40-bin.jar

2. Scala 代码实现(含:paste用法)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
:paste
// 导入必要包
import org.apache.spark.sql.SparkSession
import java.util.Properties

// 创建SparkSession
val spark = SparkSession.builder()
.appName("SparkToMySQLWriter")
.getOrCreate()

// 创建学生信息DataFrame
val studentData = Seq(
(6, "孙八", "男", 23),
(7, "周九", "女", 20),
(8, "吴十", "男", 21),
(9, "郑十一", "女", 22),
(10, "王十二", "男", 19)
)
val df = spark.createDataFrame(studentData).toDF("id", "name", "gender", "age")

// 配置MySQL连接(强制安装后需确保密码正确)
val jdbcUrl = "jdbc:mysql://localhost:3306/school?useSSL=false&allowPublicKeyRetrieval=true"
val tableName = "students"
val connectionProps = new Properties()
connectionProps.put("user", "root")
connectionProps.put("password", "YourNewPassword123!") // 强制安装时设置的密码
connectionProps.put("driver", "com.mysql.jdbc.Driver")

// 追加写入数据(避免主键冲突可改用overwrite模式)
df.write.mode("append").jdbc(jdbcUrl, tableName, connectionProps)

// 验证数据(可选)
val readDF = spark.read.jdbc(jdbcUrl, tableName, connectionProps)
println("读取到的数据:")
readDF.show(false)

// 先回车 然后(可能省略)
// 按Ctrl+D执行代码

3. :paste用法说明

  • 功能:在 Spark Shell 中启用多行粘贴模式,避免单行输入导致的语法错误。

  • 操作步骤

    1. 输入:paste并按回车;
    2. 粘贴完整代码块;
    3. Ctrl+D(Linux/Mac)或Ctrl+Z(Windows)执行。

五、常见问题及解决方案(含强制安装相关)

1. 中文乱码问题

原因:字符集不统一

  • MySQL 强制安装后默认字符集可能为 latin1,需手动修改。

解决步骤:

  1. 修改 MySQL 表字符集(5.1.x 驱动适用)

    1
    2
    ALTER DATABASE school CHARACTER SET utf8 COLLATE utf8_general_ci;
    ALTER TABLE students CONVERT TO CHARACTER SET utf8;
  2. 更新 MySQL 配置文件

    1
    sudo vi /etc/my.cnf

    [mysqld]部分添加:

    1
    2
    character-set-server = utf8
    collation-server = utf8_general_ci

    重启服务:sudo systemctl restart mysqld

  3. JDBC URL 添加字符集参数

    1
    val jdbcUrl = "jdbc:mysql://localhost:3306/school?useSSL=false&characterEncoding=utf8"

升级驱动方案(推荐):

若需支持 Emoji / 生僻字,升级驱动至 8.0 + 并使用utf8mb4

1
2
3
// 8.0+驱动配置
val jdbcUrl = "jdbc:mysql://localhost:3306/school?useSSL=false&characterEncoding=utf8mb4&serverTimezone=UTC"
connectionProps.put("driver", "com.mysql.cj.jdbc.Driver") // 8.0+驱动类名

2. 主键冲突(Duplicate entry

原因:强制安装后可能残留测试数据或重复写入

  • 场景:多次执行写入操作,id重复触发主键约束。

解决方法:

  • 覆盖模式(清空表后写入)

    1
    df.write.mode("overwrite").jdbc(jdbcUrl, tableName, connectionProps)
  • 过滤重复 ID

    1
    2
    3
    val existingIds = spark.read.jdbc(jdbcUrl, tableName, connectionProps).select("id").as[Int].collect().toSet
    val filteredDF = df.filter(!df("id").isin(existingIds: _*))
    filteredDF.write.mode("append").jdbc(jdbcUrl, tableName, connectionProps)

3. 驱动不支持utf8mb4错误

现象:

java.sql.SQLException: Unsupported character encoding 'utf8mb4' 原因:MySQL Connector/J 5.1.x 驱动不支持utf8mb4,仅支持utf8

解决方案:

  • 方案 1:使用utf8编码(5.1.x 驱动): 见上文中文乱码问题解决方案。
  • 方案 2:升级驱动至 8.0+: 见中文乱码问题 - 升级驱动方案。

4. MySQL 服务启动失败(强制安装后)

原因:依赖缺失或文件损坏

  • 强制安装可能未正确初始化系统服务文件

解决步骤:

1
2
3
4
5
6
# 重新初始化MySQL
sudo mysql_secure_installation

# 修复系统服务文件
sudo systemctl daemon-reload
sudo systemctl start mysqld

六、总结

1. 强制安装适用场景

  • 测试环境快速部署;
  • 离线环境无法获取官方 GPG 密钥;
  • 临时绕过依赖问题(需承担稳定性风险)。

2. 最佳实践建议

  • 生产环境优先使用官方源正常安装,确保密钥验证和依赖完整性;
  • 处理中文时,5.1.x 驱动使用utf8,8.0 + 驱动使用utf8mb4
  • 写入数据前通过.mode("overwrite")或 ID 过滤避免主键冲突。

通过以上步骤,可在强制安装 MySQL 5.7 的环境下,成功使用 Spark 完成数据写入及验证。


使用Spark将DataFrame数据写入MySQL表的完整指南(含MySQL5.7强制安装记录)
http://example.com/2025/05/20/使用Spark将DataFrame数据写入MySQL表的完整指南(含MySQL5-7强制安装记录/
作者
John Doe
发布于
2025年5月20日
许可协议