首页 > 其他分享 >Saprk:数据插入的优化(forachPartition)

Saprk:数据插入的优化(forachPartition)

时间:2024-10-22 21:20:54浏览次数:8  
标签:Saprk count stat word val RDD forachPartition 数据库 插入

在spark中处理数据,将处理好的数据保存到mysql中,如果直接处理RDD数据,将其循环使得每一条数据都能插入到数据库中,如果数据量不大的情况下,可以使用。但是针对大数据,处理的数据是海量的,所以每次循环一条数据都要创建新的数据库连接,就会非常耗时,如果把数据库的连接放在外面,这样又造成了算子内外变量的问题,所以我们用foreachPartition来优化,这是每个分区建立一次数据库连接,然后再在每个分区内迭代器循环,这样极大减少了连接次数,提高了性能

代码如下:

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

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

object Demo20ToMysql {
  def main(args: Array[String]): Unit = {
    //1、创建spark的执行环境
    val conf = new SparkConf()
    //设置运行模式
    conf.setMaster("local")
    conf.setAppName("wc")
    val sc = new SparkContext(conf)

    //2、读取数据
    //RDD:弹性的分布式数据集(相当于List)
    val linesRDD: RDD[String] = sc.textFile("data/lines.txt")

    //一行转换多行
    val wordsRDD: RDD[String] = linesRDD.flatMap(_.split(","))

    val kvRD: RDD[(String, Int)] = wordsRDD.map(word => (word, 1))

    //统计单词的数量
    val countRDD: RDD[(String, Int)] = kvRD.reduceByKey((x, y) => x + y)

    val start: Long = System.currentTimeMillis()
    /*   //1 创建数据库连接
       //数据库连接不能在网络中传输
       val con: Connection = DriverManager.getConnection("jdbc:mysql://master:3306/bigdata31", "root", "123456")
       val end: Long = System.currentTimeMillis()
       println(end - start)

       //保存到数据库中,使用JDBC
       countRDD.foreach {
         case (word, count) =>
           //2 编写sql插入数据
           val stat: PreparedStatement = con.prepareStatement("insert into word_count values(?,?)")
           stat.setString(1, word)
           stat.setInt(2, count)
           stat.execute()
       }
       con.close()*/

    //foreachPartition: 训练分区
    countRDD.foreachPartition(iter => {
      //1 创建数据库连接
      //每一个分区创建一个数据库连接
      val con: Connection = DriverManager.getConnection("jdbc:mysql://master:3306/bigdata31", "root", "123456")
      val end: Long = System.currentTimeMillis()
      println(end - start)

      //在分区内循环
      iter.foreach {
        case (word, count) =>
          //2 编写sql插入数据
          val stat: PreparedStatement = con.prepareStatement("insert into word_count values(?,?)")
          stat.setString(1, word)
          stat.setInt(2, count)
          stat.execute()
      }
      con.close()
    })
  }
}

标签:Saprk,count,stat,word,val,RDD,forachPartition,数据库,插入
From: https://blog.csdn.net/ABU009/article/details/143129814

相关文章

  • 关于Workbench命令流的插入
    引言Workbench虽然自身的功能强大,但是有些功能还需要插入命令流实现:(1)命令流可以实现材料模型的定义和部分单元的控制;(2)命令流可以实现对接触对的实常数和关键字的控制;(3)命令流可以实现对求解的补充控制;(4)命令流可以补充后处理的功能。1、前处理的插入命令KEYOPT,ITY......
  • 【办公类-】材料报销批量插入图片
    背景需求:我们班分到美工室,需要准备大量材料,根据原始的报销单EXCLE,里面有商品名称、图片、链接、单位、数量等信息今天我和搭档一起填写新表,发现手机截图的图片插入EXCEL后非常大,需要手动调整图片大小,每一项都要这么插入调整,非常费劲。因此,我将每张截图单独放在图片文件......
  • Mongodb(4)索引,查看执行计划,聚合操作aggregate,表关联查询,批量插入测试数据,执行计
    创建索引,支持:单键索引、复合索引,唯一索引创建索引后台执行db.books.createIndex({open:1,close:1},{background:true})对内嵌文档字段创建索引:db.books.createIndex({"author.name":1})创建唯一索引db.books.createIndex({title:1},{unique:true})在包含嵌套对象的......
  • Python 在Excel中插入、替换、提取、或删除图片
    Excel是主要用于处理表格和数据的工具,我们也能在其中插入、编辑或管理图片,为工作表增添视觉效果,提升报告的吸引力。本文将详细介绍如何使用Python操作Excel中的图片,包含以下4个基础示例:Python在Excel中插入图片Python替换Excel中的图片Python提取Excel中的图片Python删除......
  • mongodb 查询条件,查询逻辑对照表,逻辑运算符,正则表达式匹配查询,排序,分页/巧分页,更新操
    mongodb查询条件,查询逻辑对照表,逻辑运算符,正则表达式匹配查询,排序,分页/巧分页,更新操作符,更新单个/多个文档,删除文档,批量插入,$type操作符,内嵌文档和数组查找修改1.条件查询SQLMQLa=1{a:1}a<>1{a:{$ne:1}}a>1{a:{$gt:1}}a>=1{a:{$gte:1}}a<1{a:{$lt......
  • TypeORM批量插入
    在TypeORM中,批量插入数据可以通过多种方法实现,包括 save、insert 和 createQueryBuilder。这些方法各有优缺点,适用于不同的场景。使用createQueryBuilder进行批量插入createQueryBuilder 是性能最优的批量插入方法。以下是一个示例:awaitdataSource.createQ......
  • python在word文档中插入题注和查找题注
    目录1、打开word文档2、在文档中为图片插入题注3、在文档中为表格插入题注4、遍历所有题注5、更新题注编号在自动化处理word时,可以使用脚本为word文档中图片和表格插入题注;也可以查找word文档中已经插入的题注,查看并修改。1、打开word文档importwin32com.clientas......
  • 代码随想录算法训练营day19| 235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插
    学习资料:https://programmercarl.com/0235.二叉搜索树的最近公共祖先.html****学习记录:235.二叉搜索树的最近公共祖先(加一个函数traversal)点击查看代码#Definitionforabinarytreenode.#classTreeNode(object):#def__init__(self,x):#self.val=x......
  • 必学排序算法——插入排序
    目录前言、一、什么是插入排序算法二、插入排序的特点三、算法基本步骤四、算法图解五、c代码模板六、经典例题1.去掉最低工资和最高工资后的工资平均值代码题解2.删除某些元素后的数组均值3.学生分数的最小差值七、结语前言、插入排序算法是必须掌握的一种基础算......
  • 如何给VS2022的代码背景插入好看的图片呢?
    目录效果展示操作步骤效果展示在代码编辑区中插入了自己喜欢的图片!!!操作步骤步骤1:步骤2:搜索:ClaudiaIDE步骤3:步骤4:步骤5:步骤6:可以选择自己喜欢的图片。总结:画红色圈里面是一些参数,大家可以自行试一下,也可以和我保持一致。希望对大家有所帮助,希望大家会喜欢VS2022的......