spark练习--mysql的读取
前面我们一直操作的是,通过一个文件来读取数据,这个里面不涉及数据相关的只是,今天我们来介绍一下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的读取的更多相关文章
- 使用Apache Spark 对 mysql 调优 查询速度提升10倍以上
		在这篇文章中我们将讨论如何利用 Apache Spark 来提升 MySQL 的查询性能. 介绍 在我的前一篇文章Apache Spark with MySQL 中介绍了如何利用 Apache Spa ... 
- 使用spark与MySQL进行数据交互的方法
		在项目中,遇到一个场景是,需要从Hive数据仓库中拉取数据,进行过滤.裁剪或者聚合之后生成中间结果导入MySQL. 对于这样一个极其普通的离线计算场景,有多种技术选型可以实现.例如,sqoop,MR, ... 
- Spark操作MySQL,Hive并写入MySQL数据库
		最近一个项目,需要操作近70亿数据进行统计分析.如果存入MySQL,很难读取如此大的数据,即使使用搜索引擎,也是非常慢.经过调研决定借助我们公司大数据平台结合Spark技术完成这么大数据量的统计分析. ... 
- Python 基于Python从mysql表读取千万数据实践
		基于Python 从mysql表读取千万数据实践 by:授客 QQ:1033553122 场景: 有以下两个表,两者都有一个表字段,名为waybill_no,我们需要从tl_waybill_b ... 
- 记录一次spark连接mysql遇到的问题
		版权声明:本文为博主原创文章,未经博主允许不得转载 在使用spark连接mysql的过程中报错了,错误如下 08:51:32.495 [main] ERROR - Error loading fact ... 
- [Spark][Python]Spark 访问 mysql , 生成 dataframe 的例子:
		[Spark][Python]Spark 访问 mysql , 生成 dataframe 的例子: mydf001=sqlContext.read.format("jdbc").o ... 
- spark SQL学习(spark连接 mysql)
		spark连接mysql(打jar包方式) package wujiadong_sparkSQL import java.util.Properties import org.apache.spark ... 
- Spark学习之数据读取与保存(4)
		Spark学习之数据读取与保存(4) 1. 文件格式 Spark对很多种文件格式的读取和保存方式都很简单. 如文本文件的非结构化的文件,如JSON的半结构化文件,如SequenceFile结构化文件. ... 
- spark读写mysql
		spark读写mysql除官网例子外还要指定驱动名称 travels.write .mode(SaveMode.Overwrite) .format("jdbc") .option ... 
随机推荐
- Android基础Activity篇——Menu
			1.创建一个menu 在res目录右击-->new-->Drirectory,创建menu,然后右击menu-->new-->Menu resource file 创建main ... 
- Oracle:Start with connect by prior 递归
			SELECT * from CONNECT BY {PRIOR列名1=列名2|列名1=PRIOR列名2} [START WITH]; Oracle的递归查询: START WITH :描述开始 ... 
- python异常处理、断言
			异常处理基本语法 捕获异常 try: 语句1 语句2 ... except ERRNAME as e: print(e) #尝试执行语句,捕获到ERRNAME异常时打印异常信息e 捕获多个异常 try ... 
- 类型信息(RTTI和反射)——RTTI
			运行时类型信息可以让你在程序运行时发现和使用类型信息. 在Java中运行时识别对象和类的信息有两种方式:传统的RTTI,以及反射.下面就先来说下RTTI. 1.RTTI: RTTI:在运行时,识别一个 ... 
- Linux系统如何设置开机程序自启动
			在Linux系统如何让程序开机时自动启动 核心提示:系统的服务在开机时一般都可以自动启动,那在linux系统下如果想要程序在开机时自动启动怎么办?我们知道在 windows系统“开始”--& ... 
- 05、Spark
			05.Spark shell连接到Spark集群执行作业 5.1 Spark shell连接到Spark集群介绍 Spark shell可以连接到Spark集群,spark shell本身也是spar ... 
- 概念:RPG游戏中两个兵种互相攻击的逻辑
			直接上题目: 解析题目: 根据题目的解析,进行代码的实现: 输出结果: 心得: (1) 当我们面对‘公式结果不是我们想要的’时,应该在脑海里将一个完整的攻击流程进行想象,就会对流程有个更清晰的思路 ( ... 
- 【2017-06-20】Linux应用开发工程师C/C++面试问题记录之一:Linux多线程程序的同步问题
			参考之一:Linux 线程同步的三种方法 链接地址:http://www.cnblogs.com/eleclsc/p/5838790.html 简要回答: Linux下线程同步最常用的三种方法就是互斥 ... 
- MySQL入门很简单:  13 数据备份和还原
			1. 数据备份 1)使用mysqldump命令备份 第一种:备份一个数据库 mysqldump -u username -p dbname table1 table2 ... > BackupN ... 
- 去重算法-hash-set
			Well, as Bavarious pointed out in a comment, Apple's actual CoreFoundation source is open and availa ... 
