spark action算子之foreach与foreachPartition区别

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

import scala.collection.mutable.ListBuffer

object TestForeachPartition {
  def main(args: Array[String]): Unit = {
    val context: SparkContext = new SparkContext(new SparkConf()
      .setAppName("ForeachPartition test")
      .setMaster("local"))
    val rdd1 = context.parallelize(List(
      "张三",
      "李四",
      "王5",
      "猪8戒"
    ), 2)

    /**
     * foreach一般不会把数据全部迭代出来一起处理,数据量不确定,容易内存溢出。
     * 一般就是拿到一条数据就进行下处理
     */
    rdd1.foreach(r => {
      val list = new ListBuffer[String]()
      list += r
      if (list.size >= 10000) {
        println("插入数据库连接" + list.toString())
        println("关闭数据库连接")
        //丢失了如果list<10000时的数据,因此一般每条数据逐一处理
      }
      println("插入数据库连接" + r)
      println("关闭数据库连接")
    })

    /**
     * 最后说下这两个action的区别:
     *
     * Foreach与foreachPartition都是在每个partition中对iterator进行操作,
     *
     * 不同的是,foreach是直接在每个partition中直接对iterator执行foreach操作,而传入的function只是在foreach内部使用,
     *
     * 而foreachPartition是在每个partition中把iterator给传入的function,让function自己对iterator进行处理.
     */
    rdd1.foreachPartition(iter => {
      val list = new ListBuffer[String]()
      println("创建数据库连接")
      iter.foreach(i => {
        list += i
        if (list.size > 10000) {
          println("插入数据库连接" + list.toString())
          println("关闭数据库连接")
        }
      })
      if (list.size > 0) {
        println("插入数据库连接" + list.toString())
        println("关闭数据库连接")
      }
    })
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值