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 os模块介绍
Nov 30 Python
Python的Bottle框架的一些使用技巧介绍
Apr 08 Python
linux查找当前python解释器的位置方法
Feb 20 Python
python GUI库图形界面开发之PyQt5拖放控件实例详解
Feb 25 Python
Python读取Excel一列并计算所有对象出现次数的方法
Sep 04 Python
Python环境使用OpenCV检测人脸实现教程
Oct 19 Python
Python中常用的os操作汇总
Nov 05 Python
python 解决Windows平台上路径有空格的问题
Nov 10 Python
python 装饰器的基本使用
Jan 13 Python
用python制作个音乐下载器
Jan 30 Python
Python 批量下载阴阳师网站壁纸
May 19 Python
Python加密技术之RSA加密解密的实现
Apr 08 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 MSSQL 分页实例
2016/04/13 PHP
PHP框架自动加载类文件原理详解
2017/06/06 PHP
php获取手机端的号码以及ip地址实例代码
2018/09/12 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式二图文详解
2019/04/09 PHP
laravel邮件发送的实现代码示例
2020/01/31 PHP
JavaScript国旗变换效果代码
2008/08/13 Javascript
javascript globalStorage类代码
2009/06/04 Javascript
JQuery对id中含有特殊字符的转义处理示例
2013/09/06 Javascript
VueJS全面解析
2016/11/10 Javascript
JS 对java返回的json格式的数据处理方法
2016/12/05 Javascript
利用node.js搭建简单web服务器的方法教程
2017/02/20 Javascript
基于JavaScript实现移动端无限加载分页
2017/03/27 Javascript
Vue SSR 组件加载问题
2018/05/02 Javascript
vue中keep-alive的用法及问题描述
2018/05/15 Javascript
vue自定义移动端touch事件之点击、滑动、长按事件
2018/07/10 Javascript
vue实现简单的MVVM框架
2018/08/05 Javascript
jsonp实现百度下拉框功能的方法分析
2019/05/10 Javascript
layui 选择列表,打勾,点击确定返回数据的例子
2019/09/02 Javascript
vue父子组件的通信方法(实例详解)
2019/11/10 Javascript
解决Vue打包上线之后部分CSS不生效的问题
2019/11/12 Javascript
Vue开发环境跨域访问问题
2020/01/22 Javascript
微信jssdk踩坑之签名错误invalid signature
2020/05/19 Javascript
微信小程序用户盒子、宫格列表的实现
2020/07/01 Javascript
[02:31]DOTA2帕克 英雄基础教程
2013/11/26 DOTA
[01:00:53]OG vs IG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
基于windows下pip安装python模块时报错总结
2018/06/12 Python
python基于opencv检测程序运行效率
2019/12/28 Python
使用phonegap进行提示操作的具体方法
2017/03/30 HTML / CSS
澳大利亚免息网上购物:Shop Zero
2016/09/17 全球购物
大学生工作推荐信范文
2013/12/02 职场文书
关于爱国的标语
2014/06/24 职场文书
财务务虚会发言材料
2014/10/20 职场文书
论群众路线学习心得体会
2014/10/31 职场文书
SONY AN-LP1 短波有源天线放大器
2021/04/22 无线电
Java网络编程之UDP实现原理解析
2021/09/04 Java/Android
简单聊聊TypeScript只读修饰符
2022/04/06 Javascript