pyspark对Mysql数据库进行读写的实现


Posted in Python onDecember 30, 2020

pyspark是Spark对Python的api接口,可以在Python环境中通过调用pyspark模块来操作spark,完成大数据框架下的数据分析与挖掘。其中,数据的读写是基础操作,pyspark的子模块pyspark.sql 可以完成大部分类型的数据读写。文本介绍在pyspark中读写Mysql数据库。

1 软件版本

在Python中使用Spark,需要安装配置Spark,这里跳过配置的过程,给出运行环境和相关程序版本信息。

  • win10 64bit
  • java 13.0.1
  • spark 3.0
  • python 3.8
  • pyspark 3.0
  • pycharm 2019.3.4

2 环境配置

pyspark连接Mysql是通过java实现的,所以需要下载连接Mysql的jar包。

下载地址

pyspark对Mysql数据库进行读写的实现

选择下载Connector/J,然后选择操作系统为Platform Independent,下载压缩包到本地。

pyspark对Mysql数据库进行读写的实现

然后解压文件,将其中的jar包mysql-connector-java-8.0.19.jar放入spark的安装目录下,例如D:\spark\spark-3.0.0-preview2-bin-hadoop2.7\jars

pyspark对Mysql数据库进行读写的实现

环境配置完成!

3 读取Mysql

脚本如下:

from pyspark.sql import SQLContext, SparkSession

if __name__ == '__main__':
  # spark 初始化
  spark = SparkSession. \
    Builder(). \
    appName('sql'). \
    master('local'). \
    getOrCreate()
  # mysql 配置(需要修改)
  prop = {'user': 'xxx', 
      'password': 'xxx', 
      'driver': 'com.mysql.cj.jdbc.Driver'}
  # database 地址(需要修改)
  url = 'jdbc:mysql://host:port/database'
  # 读取表
  data = spark.read.jdbc(url=url, table='tb_newCity', properties=prop)
  # 打印data数据类型
  print(type(data))
  # 展示数据
  data.show()
  # 关闭spark会话
  spark.stop()
  • 注意点:
  • prop参数需要根据实际情况修改,文中用户名和密码用xxx代替了,driver参数也可以不需要;
  • url参数需要根据实际情况修改,格式为jdbc:mysql://主机:端口/数据库
  • 通过调用方法read.jdbc进行读取,返回的数据类型为spark DataFrame;

运行脚本,输出如下:

pyspark对Mysql数据库进行读写的实现

4 写入Mysql

脚本如下:

import pandas as pd
from pyspark import SparkContext
from pyspark.sql import SQLContext, Row

if __name__ == '__main__':
  # spark 初始化
  sc = SparkContext(master='local', appName='sql')
  spark = SQLContext(sc)
  # mysql 配置(需要修改)
  prop = {'user': 'xxx',
      'password': 'xxx',
      'driver': 'com.mysql.cj.jdbc.Driver'}
  # database 地址(需要修改)
  url = 'jdbc:mysql://host:port/database'

  # 创建spark DataFrame
  # 方式1:list转spark DataFrame
  l = [(1, 12), (2, 22)]
  # 创建并指定列名
  list_df = spark.createDataFrame(l, schema=['id', 'value']) 
  
  # 方式2:rdd转spark DataFrame
  rdd = sc.parallelize(l) # rdd
  col_names = Row('id', 'value') # 列名
  tmp = rdd.map(lambda x: col_names(*x)) # 设置列名
  rdd_df = spark.createDataFrame(tmp) 
  
  # 方式3:pandas dataFrame 转spark DataFrame
  df = pd.DataFrame({'id': [1, 2], 'value': [12, 22]})
  pd_df = spark.createDataFrame(df)

  # 写入数据库
  pd_df.write.jdbc(url=url, table='new', mode='append', properties=prop)
  # 关闭spark会话
  sc.stop()

注意点:

propurl参数同样需要根据实际情况修改;

写入数据库要求的对象类型是spark DataFrame,提供了三种常见数据类型转spark DataFrame的方法;

通过调用write.jdbc方法进行写入,其中的model参数控制写入数据的行为。

model 参数解释
error 默认值,原表存在则报错
ignore 原表存在,不报错且不写入数据
append 新数据在原表行末追加
overwrite 覆盖原表

5 常见报错

Access denied for user …

pyspark对Mysql数据库进行读写的实现

原因:mysql配置参数出错
解决办法:检查user,password拼写,检查账号密码是否正确,用其他工具测试mysql是否能正常连接,做对比检查。

No suitable driver

pyspark对Mysql数据库进行读写的实现

原因:没有配置运行环境
解决办法:下载jar包进行配置,具体过程参考本文的2 环境配置

到此这篇关于pyspark对Mysql数据库进行读写的实现的文章就介绍到这了,更多相关pyspark Mysql读写内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python 的 with 语句详解
Jun 13 Python
对Python中的@classmethod用法详解
Apr 21 Python
Python实现的求解最大公约数算法示例
May 03 Python
Python调用服务接口的实例
Jan 03 Python
Python基础之条件控制操作示例【if语句】
Mar 23 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
Feb 23 Python
Python实现分数序列求和
Feb 25 Python
Python unittest单元测试框架及断言方法
Apr 15 Python
python cv2.resize函数high和width注意事项说明
Jul 05 Python
Python数据模型与Python对象模型的相关总结
Jan 26 Python
python实现图片转字符画
Feb 19 Python
Python学习之包与模块详解
Mar 19 Python
python实现无边框进度条的实例代码
Dec 30 #Python
python中的列表和元组区别分析
Dec 30 #Python
python实现xml转json文件的示例代码
Dec 30 #Python
python实现KNN近邻算法
Dec 30 #Python
python 实现逻辑回归
Dec 30 #Python
Python 随机按键模拟2小时
Dec 30 #Python
Python的scikit-image模块实例讲解
Dec 30 #Python
You might like
PHP HTTP 认证实例详解
2016/11/03 PHP
PHP面向对象五大原则之接口隔离原则(ISP)详解
2018/04/04 PHP
用js实现控制内容的向上向下滚动效果
2007/06/26 Javascript
javascript attachEvent和addEventListener使用方法
2009/03/19 Javascript
jQuery-ui中自动完成实现方法
2010/06/10 Javascript
javascript 日期时间 转换的方法
2013/02/21 Javascript
引用外部js乱码问题分析及解决方案
2013/04/12 Javascript
Extjs407 getValue()和getRawValue()区别介绍
2013/05/21 Javascript
js 获取input点选按钮的值的方法
2014/04/14 Javascript
Vue.js快速入门实例教程
2016/10/15 Javascript
利用js来实现缩略语列表、文献来源链接和快捷键列表
2016/12/16 Javascript
jQuery命名空间与闭包用法示例
2017/01/12 Javascript
JavaScript中for循环的几种写法与效率总结
2017/02/03 Javascript
微信小程序 下拉列表的实现实例代码
2017/03/08 Javascript
解决LayUI表单获取不到data的问题
2018/08/20 Javascript
angular 实时监听input框value值的变化触发函数方法
2018/08/31 Javascript
小程序云开发教程如何使用云函数实现点赞功能
2019/05/18 Javascript
Python标准异常和异常处理详解
2015/02/02 Python
使用IPython来操作Docker容器的入门指引
2015/04/08 Python
在Python下进行UDP网络编程的教程
2015/04/29 Python
Python入门之modf()方法的使用
2015/05/15 Python
Python xlwt设置excel单元格字体及格式
2020/04/18 Python
好的Python培训机构应该具备哪些条件
2018/05/23 Python
对Python 获取类的成员变量及临时变量的方法详解
2019/01/22 Python
Python 类,property属性(简化属性的操作),@property,property()用法示例
2019/10/12 Python
解决Python中导入自己写的类,被划红线,但不影响执行的问题
2020/07/13 Python
django跳转页面传参的实现
2020/09/17 Python
css3实现多个元素依次显示效果
2017/12/12 HTML / CSS
HTML5 canvas实现雪花飘落特效
2016/03/08 HTML / CSS
美国便宜的横幅和标志印刷在线:Best of Signs
2019/05/29 全球购物
瑞士首家网上药店折扣店:McDrogerie
2020/12/22 全球购物
餐厅执行经理岗位职责范本
2014/02/26 职场文书
化妆品活动策划方案
2014/05/23 职场文书
CSS3 实现的图片悬停的切换按钮
2021/04/13 HTML / CSS
使用Java去实现超市会员管理系统
2022/03/18 Java/Android
MySQL慢查询中的commit慢和binlog中慢事务的区别
2022/06/16 MySQL