Spark RDD算子之foreachPartition

本文探讨了在Spark中处理大量数据时如何优化数据库连接的问题。通过使用foreachPartition替代foreach方法,可以显著减少数据库连接的创建次数,从而提升整体性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,看如下代码

ds.foreachRDD(
    rdd =>{
        // 此处属于rdd外,在driver端执行
        //driver和executor数据传输需要序列化
        rdd.foreach{
            // rdd里面,在executor执行
            case( (a,b) =>{
                val conn: Connection = JDBCUtil.getConnection
                conn.close()
            })
        }
    }
)

在如上代码情况下,rdd中每一条数据处理时都会创建连接,有问题。

但是如果放在foreach外面,因为foreach是RDD的算子,算子之外的代码是在Driver端执行,算子内的代码是在Executor端执行,这样涉及闭包操作。这样需要将Driver端的数据传递到Executor端,需要将数据序列化。但是数据库的连接对象是不能被序列化的。

 

此时可以用foreachPartition。

foreachPartition算子会以一个分区为单位进行数据处理。

代码改为如下:

ds.foreachRDD(
      rdd => {
        rdd.foreachPartition(
          iter => {
            val conn = JDBCUtil.getConnection
            iter.foreach {
              case (a,b) => {

              }
            }
            conn.close()
          }
        )
    }
)

此时foreachPartition在每一个分区创建一个数据库连接,性能得到提高。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IreneByron

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值