本文始发于个人公众号:TechFlow,原创不易,求个关注
今天是spark第三篇文章,我们继续来看RDD的一些操作。
我们前文说道在spark当中RDD的操作可以分为两种,一种是转化操作(transformation),另一种是行动操作(action)。在转化操作当中,spark不会为我们计算结果,而是会生成一个新的RDD节点,记录下这个操作。只有在行动操作执行的时候,spark才会从头开始计算整个计算。
而转化操作又可以进一步分为针对元素的转化操作以及针对集合的转化操作。
针对元素的转化操作
针对元素的转化操作非常常用,其中最常用的就是map和flatmap。从名字上看这两者都是map操作,map操作我们都知道,在之前的MapReduce文章以及Python map、reduce用法的文章当中都有提及。简而言之就是可以将一个操作映射在每一个元素上。
比如假设我们有一个序列[1, 3, 4, 7],我们希望将当中每一个元素执行平方操作。我们当然可以用for循环执行,但是在spark当中更好的办法是使用map。
nums = sc.parallelize([1, 3, 4, 7])
spuare = nums.map(lambda x: x * x)
我们知道map是一个转化操作,所以square仍然是一个RDD,我们直接将它输出不会得到结果,只会得到RDD的相关信息:
内部RDD的转化图是这样的:
我们想看结果就必须要执行行动操作,比如take,我们take一下查看一下结果:
和我们的预期一致,对于之前一直关注的同学来说map操作应该已经很熟悉了,那么这个flatmap又是什么呢?
差别就在这个flat,我们都知道flat是扁平的意思,所以flatmap就是说map执行之后的结果扁平化。说白了也就是说如果map执行之后的结果是一个数组的话,那么会将数组拆开,把里面的内容拿出来组合到一起。
我们一起来看一个例子:
texts = sc.parallelize