pyspark to mysql_Pyspark学习笔记第2篇:connect mysql
pyspark 怎样将 rdd 写到 mysql,接上一篇 pyspark connect ES
1. 错误的尝试
开始,直接尝试用python 中torndb 自建函数写库,发现这种方法比较难,pyspark 在传递函数时,
现将函数转成字符串格式,然后在每个节点上解析函数,这就要求每个节点都要安装相应的库,
如果函数调用了别的自建的 class 或 function 就要求每个节点都能正确调用,这就比较麻烦,放弃。
2. jdbc to mysql
文档说明 jdbc documentation 接下来尝试使用jdbc 写到 mysql, jdbc 的操作要求,所用的数据的格式是 dataframe, 因而,首先要将
rdd 转化成 dataframe
from pyspark.sql import Row
out_df = out_rdd.map(lambda l: Row(**dict(l))).toDF()
out_df.show(4)
+-----+-------+-------+-------------+
|newid|request| target| timestamp|
+-----+-------+-------+-------------+
| 0|1830004|2593438|1459267263513|
| 0|1352008|1898704|1459267343283|
| 0| 87201| 26893|1459267388806|
| 0| 87201| 26893|1459267380340|
+-----+-------+-------+-------------+
接下来 set mysql connect information, 写入就行了
# db information
host_ip = '*.*.*.*'
port = '****'
user_name = 'user_name'
password = 'password'
dbname = 'dbname'
table = 'table_name'
url = "jdbc:mysql://%s:%s/%s"%(host_ip,port,dbname)
properties = {"user": user_name,"password": password}
out_df.write.jdbc(mode='append',url=url,table=table,properties=properties)
这一步也有可能会遇见问题:
问题1:
py4j.protocol.Py4JJavaError: An error occurred while calling o87.jdbc.
: java.sql.SQLException: No suitable driver found for jdbc:mysql://*.*.*.*:****/****
这个错误和上一篇遇见的 error 相似,也是缺少一些包,需要加载
solution
pyspark --jars /bigdata/software/elasticsearch-hadoop-2.2.0/dist/elasticsearch-spark_2.10-2.2.0.jar,/bigdata/libs/mysql-connector-java-5.1.38.jar --conf spark.executor.extraClassPath=/bigdata/libs/mysql-connector-java-5.1.38.jar --driver-class-path /bigdata/libs/mysql-connector-java-5.1.38.jar
如果没有这些包,就需要下载一下,放到相应的路径,然后将上面的路径改为你的存放路径就行了。
问题2:
如果你的 dataframe 中列的顺序与mysql 中不对应,也会报错
out_df.show(2)
+-----+-------+-------+-------------+
|newid|request| target| timestamp|
+-----+-------+-------+-------------+
| 0|1830004|2593438|1459267263513|
| 0|1352008|1898704|1459267343283|
+-----+-------+-------+-------------+
mysql table:
+-----+-------+----------+----------+
|newid|request| timestamp| target|
+-----+-------+----------+----------+
| 0|1830004|4545454545|1459263313|
+-----+-------+----------+----------+
他将会按照列的先后顺序一一对应写:
out_df.newid –> mysql table[‘newid’]
out_df.request –> mysql table[‘request’]
out_df.target –> mysql table[‘timestamp’]
out_df.timestamp –> mysql table[‘target’]
将会出现格式错误,数据混乱等,解决办法就是,调整out_df中列的顺序,将其变成和mysql中的一致
columns = (u'newid',u'request',u'target',u'timestamp')
out_df.select(*columns).write.jdbc(mode='append',url=url,table=table,properties=properties)
就Ok 了。
3. 补充:如何 read data from mysql
# db information
host_ip = '*.*.*.*'
port = '****'
user_name = 'user_name'
password = 'password'
dbname = 'dbname'
table = 'table_name'
url = "jdbc:mysql://%s:%s/%s"%(host_ip,port,dbname)
properties = {"user": user_name,"password": password}
tmp2 = sqlContext.read.jdbc(
url=url,
table=table,
properties=properties)
tmp2.show()
+-----+-------+-------+-------------+
|newid|request| target| addtime|
+-----+-------+-------+-------------+
| 1| 52465|2627816|1459353702543|
| 2| 272357|2288924|1459353708029|
| 3| 52465| 325509|1459353686840|
| 4| 52465|2627816|1459353726933|
+-----+-------+-------+-------------+
or you can use sqlContext.read.format(‘jdbc’).options 链接例子 如果你想添加查询条件,可以这样做:
query = "(select v.newid, v.request from visit_stranger_profile as v) as temtable"
tmp2 = sqlContext.read.jdbc(
url=url,
table=query,
properties=properties)
tmp2.show(5)
+-----+-------+
|newid|request|
+-----+-------+
| 217| -100|
| 2984| -100|
| 3014| -100|
| 3018| -100|
| 130| 253|
+-----+-------+
finish
pyspark to mysql_Pyspark学习笔记第2篇:connect mysql相关推荐
- OracleDesigner学习笔记1――安装篇
OracleDesigner学习笔记1――安装篇 QQ:King MSN:qiutianwh@msn.com Email:qqking@gmail.com 一. 前言 Oracle是当 ...
- 设计模式学习笔记(目录篇)
设计模式学习笔记(目录篇) 为了方便查看,特此将设计模式学习笔记系列单独做一个目录. 1 设计模式学习笔记(一:命令模式) 2 设计模式学习笔记(二:观察者模式) 3 设计模式学习笔记(三 ...
- Redis学习笔记1-理论篇
目录 1,Redis 数据类型的底层结构 1.1,Redis 中的数据类型 1.2,全局哈希表 1.3,数据类型的底层结构 1.4,哈希冲突 1.5,rehash 操作 2,Redis 的 IO 模型 ...
- Redis学习笔记(实战篇)(自用)
Redis学习笔记(实战篇)(自用) 本文根据黑马程序员的课程资料与百度搜索的资料共同整理所得,仅用于学习使用,如有侵权,请联系删除 文章目录 Redis学习笔记(实战篇)(自用) 1.基于Sessi ...
- 树莓派4B学习笔记——IO通信篇(UART)
文章目录 UART简介 树莓派使用UART与串口屏通信 串口屏简介 硬件连接 配置串口接口 树莓派打开UART接口 树莓派安装串口调试助手 编程实现 wiringSerial.h Serial简介 C ...
- JavaScript学习笔记之入门篇
JavaScript学习笔记之入门篇 JavaScript引入 1. 页面级 js: 2. 外部js文件: JavaScript变量 1. 变量的作用: 2. 声明变量: 3. 变量赋值: 4. 单一 ...
- 《软技能-代码之外的生存指南》学习笔记之理财篇
<软技能–代码之外的生存指南>学习笔记之理财篇 作者:[美] John Z. Sonmez 摘要:这是⼀本真正从"⼈"(⽽⾮技术也⾮管理)的⾓度关注软件开发⼈员⾃⾝发展 ...
- 3、Latex学习笔记之表格篇
目录 表格 1.基本结构 1.1框架 1.2行高 1.3标题 1.4标签 1.5居中 1.6表格 2.引用表格 3.常见表格类型 3.1三线表 3.2 斜线表头 3.3合并单元格 4.在线表格生成工具 ...
- flink1.12.0学习笔记第2篇-流批一体API
flink1.12.0学习笔记第 2 篇-流批一体API flink1.12.0学习笔记第1篇-部署与入门 flink1.12.0学习笔记第2篇-流批一体API flink1.12.0学习笔记第3篇- ...
- jqGrid 学习笔记整理——基础篇
jqGrid 学习笔记整理--基础篇 jqGrid 实例中文版网址:http://blog.mn886.net/jqGrid/ 国外官网:http://www.trirand.com/blog/ 本人 ...
最新文章
- [Swift]LeetCode206. 反转链表 | Reverse Linked List
- Linux下dislocate命令用法,五个超酷Linux命令
- 分享一个多线程实现[冒泡][选择][二分法]排序的例子
- 在Eclipse中查看JDK类库的源代码
- ios 自动打包命令_通过命令行xcodebuild编译打包iOS应用
- Linux系统平均负载3个数字的含义
- Spring cloud--鸿鹄Cloud分布式微服务云系统—Config
- pytorchOCR之CRNN
- 房地产主数据管理全周期实践[转]
- html实现tab 左右滑动
- ipv6是什么?ipv6怎么设置?
- 搭建表白网站详细教程,小白也可以学懂!!!!
- ★如何引导客户需求?几个经…
- c++在csv写入汉字_python-opencv表格识别转csv
- 冯诺依曼体系结构、哈佛体系结构与改进型哈佛结构之间的区别
- DeprecationWarning: currentThread() is deprecated, use current_thread() instead
- 疯狂java讲义pdf百度云,成功入职阿里
- Bat调用/弹出文件或文件夹选择对话框
- 淘宝网的技术发展史(三)――分布式时代
- 历史辩证唯物主义下的金融业发展的思考*
热门文章
- 7.11计划,做个没心没肺的人
- 什么是传递(Pass-Through)会话
- Flexsim在固定资源类中没有分拣传送带?
- 20200202每日一句
- 190109每日一句
- Atitit 提升开发效率 提升团队人员能力 目录 1. 多语言扩展 提升抽象度	2 2. 从上到下法 vs 从下倒上 问题诊断解决法	2 2.1. 培训机制 上到下法	2 2.2. 问题案例
- Atitit 软件的俩大要点 提升可读性 提升扩展性 目录 1. 命名可读性	1 2. 提升扩展性法	1 3. 项目常见扩展法	2 1.结构可读性 表驱动代替if else 减少层次 Dsl
- Atitit 常见信息化系统类别erp mes crm cms oa 目录 1. 企业资源规划(ERP)、客户关系管理(CRM)、协同管理系统(CMS)是企业信息化的三大代表之作	1 2. 概
- Atitit 数据库映射到redis存储的模式 1. 常规 每条db记录映射一个redis记录	1 1.1. 表名:主键为key ,记录序列化为json为val	1 2. 每个字段映射一个redi
- Atitit 军事学 之 军事思想学与打猎学总结以及在软件行业中的应用 attilax著 1. 军事思想在软件行业技术开发中的想通之处	1 1.1. 软件开发本质上是一种作战,敌人是时间与费用成本