- spark连接mysql需要JDBC驱动,其实就是一个.jar包,下载下来就可以了。但是!!!坑很多!!!整个处理流程如下:
- MySQL的JDBC驱动配置过程:
- 先下载Mysql的在Java中JDBC驱动
- MySQL的JDBC驱动配置过程:
【下载地址https://dev.mysql.com/downloads/file/?id=485758】
【Linux 下载可以用: wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java_8.0.16-1debian9_all.deb 】
- 下载的文件是,mysql-connector-java_8.0.16-1debian9_all.deb。对它进行解压。
【 ar -x mysql-connector-java_8.0.16-1debian9_all.deb】【注意,是ar,不是tar】
- 再解压一个文件data.tar.xz
【xz -d data.tar.xz】
- 再解压一个文件 data.tar
【tar -xf data.tar】<br /> 得到一个usr/ 目录
- 看到最终需要的.jar文件【cd usr/share/java】
mysql-connector-java-8.0.16.jar
b. 建立spark 与MySQL的联系,需要spark-shell启动时添加两个属性
—jars ~/…/mysql-connector-java-8.0.16.jar
—driver-class-path ~/…/mysql-connector-java-8.0.16.jar
c. 注意要点
- spark连接MySQL时,要看MySQL的版本而决定写哪个driver。
MySQL<8.0版本,driver 写com.mysql.jdbc.Driver
MySQL>8.0版本,driver 写com.mysql.cj.jdbc.Driver
- overwrite 与 append 的区别
overwrite:会删除原表及表结构,重新建立新表<br /> append :在原表后面添加数据,字段可以是原表格字段的子集。【巧用:递增唯一字段。spark生成唯一递增字段很麻烦,可以先在MySQL中建立递增的字段,再从spark中往MySQL写入数据】
d. 最终写法为【注意代码中的url写法】:
# 写入MySQL
try:
print("using driver : com.mysql.cj.jdbc.Driver")
LOGGER.info("准备写入 MySQL 数据库")
tableName.write.jdbc(
url=
"jdbc:mysql://{0}:{1}/{2}?user={3}&password={4}&useUnicode=true&characterEncoding=UTF-8&useServerPrepStmts=false&rewriteBatchedStatements=true".format(host,port,db_name,user,password),
mode=mode,
table=table_name,
properties={"driver": 'com.mysql.cj.jdbc.Driver'})
LOGGER.info("成功写入 MySQL 数据库")
except:
try:
print("change driver : com.mysql.jdbc.Driver")
tableName.write.jdbc(
url=
"jdbc:mysql://{0}:{1}/{2}?user={3}&password={4}&useUnicode=true&characterEncoding=UTF-8&useServerPrepStmts=false&rewriteBatchedStatements=true".format(host,port,db_name,user,password),
mode=mode,
table=table_name,
properties={"driver": 'com.mysql.jdbc.Driver'})
LOGGER.info("成功写入 MySQL 数据库")
except Exception as e:
LOGGER.info("写入Mysql出错,请检查配置文件。默认开启了写入MySQL")
- mysql字符集问题
写入会乱码,那么就查询一下mysql的编码,然后在url上加入两个参数useUnicode=true&characterEncoding=utf-8,以utf-8为例:
# 修改上述代码中的url为
url= "jdbc:mysql://{0}:{1}/{2}?user={3}&password={4}&useUnicode=true&characterEncoding=utf-8".format(host,port,db_name,user,password)
- spark使用JDBC写入mysql时很慢【写入大量数据时会发生】
解决方案是在url上加入这两个参数:useServerPrepStmts=false&rewriteBatchedStatements=true
# 修改上述代码中的url为
url="jdbc:mysql://{0}:{1}/{2}?user={3}&password={4}&useUnicode=true&characterEncoding=utf-8&useServerPrepStmts=false&rewriteBatchedStatements=true".format(host,port,db_name,user,password)