前面我们一直操作的是,通过一个文件来读取数据,这个里面不涉及数据相关的只是,今天我们来介绍一下spark操作中存放与读取
  1.首先我们先介绍的是把数据存放进入mysql中,今天介绍的这个例子是我们前两篇介绍的统计IP的次数的一篇内容,最后的返回值类型是List((String,Int))类型的,其内容是为:

  

  此时,我们只需要在写一个与数据库相连接,把数据放入里面即可,这个方法为data2Mysql

  val data2MySQL = (iterator:Iterator[(String,Int)]) =>{
var conn:Connection = null
var ps:PreparedStatement = null
val sql = "INSERT INTO location_info1 (location,counts,accesse_date) VALUES(?,?,?)"
try{
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/bigdata?useUnicode=true&characterEncoding=UTF-8", "root", "root")
iterator.foreach(line =>{
ps = conn.prepareStatement(sql)
ps.setString(,line._1)
ps.setInt(,line._2)
ps.setDate(,new Date(System.currentTimeMillis()))
ps.executeUpdate()
})
}catch{
case e:Exception => println("Mysql Exception")
}finally{
if(ps != null)
ps.close()
if(conn != null)
conn.close()
}
}

则此时整体代码为:

package cn.wj.spark.day06

import java.sql.{Connection, Date, DriverManager, PreparedStatement}

import org.apache.spark.{SparkConf, SparkContext}

/**
* Created by WJ on 2017/1/4.
*/
object IPLocation { val data2MySQL = (iterator:Iterator[(String,Int)]) =>{
var conn:Connection = null
var ps:PreparedStatement = null
val sql = "INSERT INTO location_info1 (location,counts,accesse_date) VALUES(?,?,?)"
try{
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/bigdata?useUnicode=true&characterEncoding=UTF-8", "root", "root")
iterator.foreach(line =>{
ps = conn.prepareStatement(sql)
ps.setString(,line._1)
ps.setInt(,line._2)
ps.setDate(,new Date(System.currentTimeMillis()))
ps.executeUpdate()
})
}catch{
case e:Exception => println("Mysql Exception")
}finally{
if(ps != null)
ps.close()
if(conn != null)
conn.close()
}
} def ip2Long(ip: String): Long = {
val fragments = ip.split("[.]")
var ipNum = 0L
for (i <- until fragments.length){
ipNum = fragments(i).toLong | ipNum << 8L
}
ipNum
} def binarySearch(lines:Array[(String,String,String)],ip:Long) :Int ={
var low =
var high = lines.length -
while(low <= high){
val middle = (low + high) /
if((ip >= lines(middle)._1.toLong) && (ip <= lines(middle)._2.toLong))
return middle
if(ip < lines(middle)._1.toLong)
high = middle -
else{
low = middle +
}
}
-
} def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("IPLocation").setMaster("local[2]")
val sc = new SparkContext(conf)
val ipRulesRdd = sc.textFile("e://Test/ip.txt").map(lines =>{
val fields = lines.split("\\|")
val start_num = fields()
val end_num = fields()
val province = fields()
(start_num,end_num,province)
})
//全部的IP映射规则
val ipRulesArrary = ipRulesRdd.collect() //广播规则,这个是由Driver向worker中广播规则
val ipRulesBroadcast = sc.broadcast(ipRulesArrary) //加载要处理的数据
val ipsRdd = sc.textFile("e://Test/access_log").map(line =>{
val fields = line.split("\\|")
fields()
}) val result = ipsRdd.map(ip =>{
val ipNum = ip2Long(ip)
val index = binarySearch(ipRulesBroadcast.value,ipNum)
val info = ipRulesBroadcast.value(index)
info
}).map(t => {(t._3,)}).reduceByKey(_+_) //将数据写入数据库中
result.foreachPartition(data2MySQL) println(result.collect().toBuffer)
sc.stop() } }

我们查询数据库,我们就可以看见

  

  2.说完了把数据放入到数据库中,但是我跟倾向于从数据库中读取数据,然后在进行操作

  例如,我们就把上面存入数据库中数据读取出来吧,主要比较懒,就是想这个样子用现成的数据库

  

package cn.wj.spark.day07

import java.sql.DriverManager

import org.apache.spark.rdd.JdbcRDD
import org.apache.spark.{SparkConf, SparkContext} /**
* Created by WJ on 2017/1/5.
*/
object JdbcRDDDemo_3 {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("JdbcRDDDemo_3").setMaster("local[2]")
val sc = new SparkContext(conf) val connection =() =>{
Class.forName("com.mysql.jdbc.Driver").newInstance()
DriverManager.getConnection("jdbc:mysql://localhost:3306/bigdata","root","root")
}
val jdbcRDD = new JdbcRDD(
sc,
connection,
"SELECT * from location_info where id >= ? AND id <= ?",
1,5,2,
r =>{
val id = r.getInt(1)
val location = r.getString(2)
val counts = r.getInt(3)
val access_date = r.getDate(4)
(id,location,counts,access_date)
}
)
val jdbcRDDC = jdbcRDD.collect()
jdbcRDDC.map(line =>{
println("id:"+line._1)
println("location:"+line._2)
println("counts:"+line._3)
println("date:"+line._4)
println("------------------------------")
})
sc.stop
}
}

  其中这个里面比较难以就是在于new JdbcRDD(),我们为什么这样写,其实当我们进入这个源码的时候,它就已经规定了这个里面写的是什么

  1.sc,

  2.connection,

  3.sql语句

  4.查询出的数据的lowereBound,upperBound,已经线程数(其实可以简单理解为分区数),这个里面我们可能回想,我就想查询出所有,为什么还要传入参数,能不能不传输上下界的参数,其实不行的,这个是代码都已近提前规定好的,就算你想全部查询完成这个整个表,你也应该让id覆盖上着整个的范围,

  5.Set,其实就是一个元祖,也可以是返回来的值

  则最后的输出结果为:

  

  最后再说一点,我们可以看到有用到foreachPartition(),这个和foreach()的区别是什么

    spark操作mysql的数据库,此时如果对于foreach(),其实我们可以选择foreachPartition(),因为当我们选择foreachPartition(),这个可以拿取一整个分区的数据然后再把他放入到数据库中,如果使用foreach()的话,则是拿取一个数据放入到数据库中,建立连接,在拿取一个数据,建立连接,再放入数据库中

spark练习--mysql的读取的更多相关文章

  1. 使用Apache Spark 对 mysql 调优 查询速度提升10倍以上

    在这篇文章中我们将讨论如何利用 Apache Spark 来提升 MySQL 的查询性能. 介绍 在我的前一篇文章Apache Spark with MySQL 中介绍了如何利用 Apache Spa ...

  2. 使用spark与MySQL进行数据交互的方法

    在项目中,遇到一个场景是,需要从Hive数据仓库中拉取数据,进行过滤.裁剪或者聚合之后生成中间结果导入MySQL. 对于这样一个极其普通的离线计算场景,有多种技术选型可以实现.例如,sqoop,MR, ...

  3. Spark操作MySQL,Hive并写入MySQL数据库

    最近一个项目,需要操作近70亿数据进行统计分析.如果存入MySQL,很难读取如此大的数据,即使使用搜索引擎,也是非常慢.经过调研决定借助我们公司大数据平台结合Spark技术完成这么大数据量的统计分析. ...

  4. Python 基于Python从mysql表读取千万数据实践

    基于Python 从mysql表读取千万数据实践   by:授客 QQ:1033553122 场景:   有以下两个表,两者都有一个表字段,名为waybill_no,我们需要从tl_waybill_b ...

  5. 记录一次spark连接mysql遇到的问题

    版权声明:本文为博主原创文章,未经博主允许不得转载 在使用spark连接mysql的过程中报错了,错误如下 08:51:32.495 [main] ERROR - Error loading fact ...

  6. [Spark][Python]Spark 访问 mysql , 生成 dataframe 的例子:

    [Spark][Python]Spark 访问 mysql , 生成 dataframe 的例子: mydf001=sqlContext.read.format("jdbc").o ...

  7. spark SQL学习(spark连接 mysql)

    spark连接mysql(打jar包方式) package wujiadong_sparkSQL import java.util.Properties import org.apache.spark ...

  8. Spark学习之数据读取与保存(4)

    Spark学习之数据读取与保存(4) 1. 文件格式 Spark对很多种文件格式的读取和保存方式都很简单. 如文本文件的非结构化的文件,如JSON的半结构化文件,如SequenceFile结构化文件. ...

  9. spark读写mysql

    spark读写mysql除官网例子外还要指定驱动名称 travels.write .mode(SaveMode.Overwrite) .format("jdbc") .option ...

随机推荐

  1. selenium 移动端测试

    selenium 可以进行移动测试的.Anroid ,IOS .进行移动端测试,需要相应的SDK ,apk.其中anriod 是selenium 支持有2中选择,remote server 和 tes ...

  2. JSON:json_encode函数不能获取属性原因及解决方案

    json_encode()是个解析json数据的函数,但是这个函数可以有两个参数 形式: json_decode ( string  $json,  ture || false )   第一个参数传字 ...

  3. 特殊矩阵的压缩存储(转自chunlanse2014)

    对称矩阵 对于一个矩阵结构显然用一个二维数组来表示是非常恰当的,但在有些情况下,比如常见的一些特殊矩阵,如三角矩阵.对称矩阵.带状矩阵.稀疏矩阵等,从节约存储空间的角度考虑,这种存储是不太合适的.下面 ...

  4. user(),current_user()函数的区别

    user() 表示当前的登录用户   current_user() 表示对应于mysql.user表里对应的账号.

  5. @Inject 注入 还是报空指针

    @Inject 注入 还是报空指针  发布于 572天前  作者 子寒磊  1435 次浏览  复制  上一个帖子  下一个帖子  标签: 无 @IocBean@Service("userM ...

  6. 字符串处理(POJ1782)

    题目链接:http://poj.org/problem?id=1782 解题报告: #include <iostream> #include <cstdio> #include ...

  7. js获取对象所有的keys

    Js中获取对象的所有key值   假如现在有一个对象 var obj = { A:2 ,B:"Ray" ,C:true ,D:function(){} } 如果想遍历对象obj中的 ...

  8. LeetCode(Two Sum)

    一.题目要求 Given an array of integers, return indices of the two numbers such that they add up to a spec ...

  9. javascript中call,apply,bind的使用

    不同点: 1.call():传参方式跟bind一样(都是以逗号隔开的传参方式),但是跟apply(以数组的形式传参)不一样, 2.bind(): 此方法应用后的情形跟call和apply不一样.该方法 ...

  10. 重新认识下数组的concat方法

    最近在学习react,看官方文档的时候,有一个例子中的一句话让我困惑.就是讲todoList的例子 concat不是连接数组的吗?看了一下concat的介绍 数组虽然是对象类型,但是对象毕竟不是数组啊 ...