map 和 mapPartitions 的区别

文章通过示例解释了Spark中的map和mapPartitions的区别,map对每个元素操作,而mapPartitions对每个分区的迭代器操作,返回迭代对象。mapPartitions效率高但可能导致OOM,可配合repartition调整。同时展示了如何使用mapPartitions结合广播变量求数据差集。

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

map 和 mapPartitions 的区别

  • map 是对 rdd 中的每一个元素进行操作

  • mapPartitions 则是对 rdd 中的每个分区的迭代器进行操作,返回的也必须是迭代对象;执行效率高,但是一次传入一个 partition 的数据,有可能会导致 OOM,因此可以在此之前进行 repartition()

# coding=utf-8
"""
Function:测试 mapPartitions()
Time: 2021.06.07
"""

from pyspark import SparkConf, SparkContext


def process(partitions):
    sum = 0
    for item in partitions:
        sum += item

    yield sum


if __name__ == '__main__':
    conf = SparkConf().setMaster("local[2]").setAppName("test_mapPartitions")
    sc = SparkContext(conf=conf)

    data = [1, 2, 3, 4, 5, 6, 7, 8]

    rdd = sc.parallelize(data, 3)
    rdd.cache()

    print(f"分区数目:{rdd.getNumPartitions()}\t{rdd.glom().collect()}")
    rdd = rdd.mapPartitions(process)
    print(rdd.collect())

    sc.stop()

广播大变量+mapPartitions 求差集

# coding=utf-8
"""
Function:测试 mapPartitions()
Time: 2021.06.07
"""

from pyspark import SparkConf, SparkContext


def test(partitions):
    data_dict = dict(broads.value)	# {'rowkey1': 'url1', 'rowkey4': 'url4'}
    for item in partitions:
        if item[0] not in data_dict:
            yield item


if __name__ == '__main__':
    conf = SparkConf().setMaster("local[2]").setAppName("test_mapPartitions")
    sc = SparkContext(conf=conf)

    data1 = [('rowkey1', 'url1'), ('rowkey2', 'url2'), ('rowkey3', 'url3'), ('rowkey4', 'url4')]
    data2 = [('rowkey1', 'url1'), ('rowkey4', 'url4')]

    rdd1 = sc.parallelize(data1)
    rdd2 = sc.parallelize(data2)

    res = rdd2.collect()
    broads = sc.broadcast(res)

    rdd3 = rdd1.mapPartitions(test)
    print(rdd3.collect())
    sc.stop()

运行结果:

[('rowkey2', 'url2'), ('rowkey3', 'url3')]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

风老魔

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

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

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

打赏作者

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

抵扣说明:

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

余额充值