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的线程来解决生产者消费问题的示例
Apr 02 Python
python实现批量修改文件名代码
Sep 10 Python
Python常见内置高效率函数用法示例
Jul 31 Python
python 字符串只保留汉字的方法
Nov 16 Python
在python中只选取列表中某一纵列的方法
Nov 28 Python
Python中按值来获取指定的键
Mar 04 Python
在python中用print()输出多个格式化参数的方法
Jul 16 Python
Python中使用gflags实例及原理解析
Dec 13 Python
浅析Django中关于session的使用
Dec 30 Python
使用python turtle画高达
Jan 19 Python
Tensorflow实现部分参数梯度更新操作
Jan 23 Python
python实现电子词典
Mar 03 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易混淆函数的区别及用法汇总
2014/11/22 PHP
PHP strcmp()和strcasecmp()的区别实例
2016/11/05 PHP
PHP实现表单提交时去除斜杠的方法
2016/12/26 PHP
PHP类与对象后期静态绑定操作实例详解
2018/12/20 PHP
javascript开发随笔一 preventDefault的必要
2011/11/25 Javascript
jQuery中:disabled选择器用法实例
2015/01/04 Javascript
如何使用jquery easyui创建标签组件
2015/11/18 Javascript
jQuery封装的屏幕居中提示信息代码
2016/06/08 Javascript
jQuery制作圣诞主题页面 更像是爱情影集
2016/08/10 Javascript
JavaScript中cookie工具函数封装的示例代码
2016/10/11 Javascript
使用jquery DataTable和ajax向页面显示数据列表的方法
2018/08/09 jQuery
vue通过数据过滤实现表格合并
2020/11/30 Javascript
vuex刷新后数据丢失的解决方法
2020/10/18 Javascript
可拖拽组件slider.js使用方法详解
2020/12/04 Javascript
Python NumPy库安装使用笔记
2015/05/18 Python
Python创建模块及模块导入的方法
2015/05/27 Python
python3+PyQt5 自定义窗口部件--使用窗口部件样式表的方法
2019/06/26 Python
python如果快速判断数字奇数偶数
2019/11/13 Python
Django操作session 的方法
2020/03/09 Python
CSS3实现彩色进度条动画的示例
2020/10/29 HTML / CSS
详解基于 Canvas 手撸一个六边形能力图
2019/09/02 HTML / CSS
美国领先的奢侈手表在线零售商:WatchMaxx
2017/12/17 全球购物
GE设备配件:GE Appliance Parts(家电零件、配件和滤水器)
2018/11/28 全球购物
英国在线药房和在线医生:LloydsPharmacy
2019/10/21 全球购物
如何开发一个JQuery插件
2016/07/28 面试题
J2EE中常用的名词进行解释
2015/11/09 面试题
《散步》教学反思
2014/03/02 职场文书
2014年秋季新学期寄语
2014/08/02 职场文书
2014年大学生党员自我评议
2014/09/22 职场文书
2014年学校法制宣传日活动总结
2014/11/01 职场文书
大学生实习证明
2015/06/16 职场文书
小学见习报告
2015/06/23 职场文书
廉洁自律心得体会2016
2016/01/13 职场文书
《女娲补天》读后感5篇
2019/12/31 职场文书
C3 线性化算法与 MRO之Python中的多继承
2021/10/05 Python
Java多线程并发FutureTask使用详解
2022/06/28 Java/Android