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相关推荐

  1. OracleDesigner学习笔记1――安装篇

    OracleDesigner学习笔记1――安装篇   QQ:King MSN:qiutianwh@msn.com Email:qqking@gmail.com 一.       前言 Oracle是当 ...

  2. 设计模式学习笔记(目录篇)

    设计模式学习笔记(目录篇) 为了方便查看,特此将设计模式学习笔记系列单独做一个目录. 1   设计模式学习笔记(一:命令模式) 2   设计模式学习笔记(二:观察者模式) 3   设计模式学习笔记(三 ...

  3. Redis学习笔记1-理论篇

    目录 1,Redis 数据类型的底层结构 1.1,Redis 中的数据类型 1.2,全局哈希表 1.3,数据类型的底层结构 1.4,哈希冲突 1.5,rehash 操作 2,Redis 的 IO 模型 ...

  4. Redis学习笔记(实战篇)(自用)

    Redis学习笔记(实战篇)(自用) 本文根据黑马程序员的课程资料与百度搜索的资料共同整理所得,仅用于学习使用,如有侵权,请联系删除 文章目录 Redis学习笔记(实战篇)(自用) 1.基于Sessi ...

  5. 树莓派4B学习笔记——IO通信篇(UART)

    文章目录 UART简介 树莓派使用UART与串口屏通信 串口屏简介 硬件连接 配置串口接口 树莓派打开UART接口 树莓派安装串口调试助手 编程实现 wiringSerial.h Serial简介 C ...

  6. JavaScript学习笔记之入门篇

    JavaScript学习笔记之入门篇 JavaScript引入 1. 页面级 js: 2. 外部js文件: JavaScript变量 1. 变量的作用: 2. 声明变量: 3. 变量赋值: 4. 单一 ...

  7. 《软技能-代码之外的生存指南》学习笔记之理财篇

    <软技能–代码之外的生存指南>学习笔记之理财篇 作者:[美] John Z. Sonmez 摘要:这是⼀本真正从"⼈"(⽽⾮技术也⾮管理)的⾓度关注软件开发⼈员⾃⾝发展 ...

  8. 3、Latex学习笔记之表格篇

    目录 表格 1.基本结构 1.1框架 1.2行高 1.3标题 1.4标签 1.5居中 1.6表格 2.引用表格 3.常见表格类型 3.1三线表 3.2 斜线表头 3.3合并单元格 4.在线表格生成工具 ...

  9. flink1.12.0学习笔记第2篇-流批一体API

    flink1.12.0学习笔记第 2 篇-流批一体API flink1.12.0学习笔记第1篇-部署与入门 flink1.12.0学习笔记第2篇-流批一体API flink1.12.0学习笔记第3篇- ...

  10. jqGrid 学习笔记整理——基础篇

    jqGrid 学习笔记整理--基础篇 jqGrid 实例中文版网址:http://blog.mn886.net/jqGrid/ 国外官网:http://www.trirand.com/blog/ 本人 ...

最新文章

  1. [Swift]LeetCode206. 反转链表 | Reverse Linked List
  2. Linux下dislocate命令用法,五个超酷Linux命令
  3. 分享一个多线程实现[冒泡][选择][二分法]排序的例子
  4. 在Eclipse中查看JDK类库的源代码
  5. ios 自动打包命令_通过命令行xcodebuild编译打包iOS应用
  6. Linux系统平均负载3个数字的含义
  7. Spring cloud--鸿鹄Cloud分布式微服务云系统—Config
  8. pytorchOCR之CRNN
  9. 房地产主数据管理全周期实践[转]
  10. html实现tab 左右滑动
  11. ipv6是什么?ipv6怎么设置?
  12. 搭建表白网站详细教程,小白也可以学懂!!!!
  13. ★如何引导客户需求?几个经…
  14. c++在csv写入汉字_python-opencv表格识别转csv
  15. 冯诺依曼体系结构、哈佛体系结构与改进型哈佛结构之间的区别
  16. DeprecationWarning: currentThread() is deprecated, use current_thread() instead
  17. 疯狂java讲义pdf百度云,成功入职阿里
  18. Bat调用/弹出文件或文件夹选择对话框
  19. 淘宝网的技术发展史(三)――分布式时代
  20. 历史辩证唯物主义下的金融业发展的思考*

热门文章

  1. 7.11计划,做个没心没肺的人
  2. 什么是传递(Pass-Through)会话
  3. Flexsim在固定资源类中没有分拣传送带?
  4. 20200202每日一句
  5. 190109每日一句
  6. Atitit 提升开发效率 提升团队人员能力 目录 1. 多语言扩展 提升抽象度 2 2. 从上到下法 vs 从下倒上 问题诊断解决法 2 2.1. 培训机制 上到下法 2 2.2. 问题案例
  7. Atitit 软件的俩大要点 提升可读性 提升扩展性 目录 1. 命名可读性 1 2. 提升扩展性法 1 3. 项目常见扩展法 2 1.结构可读性 表驱动代替if else 减少层次 Dsl
  8. Atitit 常见信息化系统类别erp mes crm cms oa 目录 1.  企业资源规划(ERP)、客户关系管理(CRM)、协同管理系统(CMS)是企业信息化的三大代表之作 1 2. 概
  9. Atitit 数据库映射到redis存储的模式 1. 常规 每条db记录映射一个redis记录 1 1.1. 表名:主键为key ,记录序列化为json为val 1 2. 每个字段映射一个redi
  10. Atitit 军事学 之 军事思想学与打猎学总结以及在软件行业中的应用 attilax著 1. 军事思想在软件行业技术开发中的想通之处 1 1.1. 软件开发本质上是一种作战,敌人是时间与费用成本