一、问题描述
在Pyspark使用Spark SQL读取MySQL数据库中的数据时出现警告,提示你正在使用已过时的 MySQL JDBC 驱动程序类名
如下图:
参数解释:
- driver: 这是 JDBC 驱动程序的类名,用于与特定数据库进行通信。对于 MySQL 数据库,驱动程序类名通常是 `"com.mysql.jdbc.Driver"`。它告诉 Spark 使用哪个驱动程序来连接 MySQL 数据库。
- url: 这是数据库的连接 URL。对于 MySQL 数据库,连接 URL 通常以 `"jdbc:mysql://"` 开头,后面跟着数据库的主机名(或 IP 地址)、端口号(默认为 3306)和数据库名称。例如,"jdbc:mysql://localhost:3306/spark"意味着连接到本地主机上的 MySQL 实例,并选择名为 "spark" 的数据库。
- dbtable: 这是要读取的数据库表的名称。上述代码中,它被设置为 `"student"`,这意味着想要从名为 "student" 的数据库表中读取数据。
- user: 这是用于连接数据库的用户名。上述代码中,它被设置为 `"root"`,这是 MySQL 数据库默认的管理员用户名。
- password: 这是用于连接数据库的密码。上述代码中,它被设置为 `"123456"`,这是与用户名对应的密码。
上述参数是笔者根据自己实际情况进行设置,读者可自行修改。
二、解决办法
- 将上述代码中的“.option("driver","com.mysql.jdbc.Driver") \”删除即可
jdbcDF = spark.read \
.format("jdbc") \
.option("url", "jdbc:mysql://localhost:3306/spark") \
.option("dbtable", "student") \
.option("user", "root") \
.option("password", "123456") \
.load()
- 或者将其中的“.option("driver","com.mysql.jdbc.Driver") \”修改为“.option("driver","com.mysql.cj.jdbc.Driver") \”亦可
jdbcDF = spark.read \
.format("jdbc") \
.option("driver","com.mysql.cj.jdbc.Driver") \
.option("url", "jdbc:mysql://localhost:3306/spark") \
.option("dbtable", "student") \
.option("user", "root") \
.option("password", "123456") \
.load()
如上,并无提示
三、问题分析
上述警告是在提示正在使用已过时的 MySQL JDBC 驱动程序类名 com.mysql.jdbc.Driver
。新的 MySQL JDBC 驱动程序类名是 com.mysql.cj.jdbc.Driver
。
警告中还指出,现在的 JDBC 驱动程序通过 SPI(Service Provider Interface)自动注册,所以通常不需要手动加载驱动程序类。意味着,可以省略 option("driver", "com.mysql.jdbc.Driver")
这个选项,Spark 将会自动使用正确的驱动程序。
如果读者不修改代码,而继续使用已经过时的驱动程序类名 `com.mysql.jdbc.Driver`,Spark 会继续加载该驱动程序,但会显示警告信息。这个警告只是提醒读者当前使用的驱动程序类名已经过时,建议使用新的驱动程序类名 `com.mysql.cj.jdbc.Driver`。
警告信息本身不会影响代码的执行,但建议尽量避免使用已经过时的类名,以便保持代码的健壮性和可维护性。因此,最好还是修改代码,使用新的驱动程序类名,以避免未来可能出现的问题。
如下,不修改代码,会提示信息但能正常加载并使用: