Spark常用算子讲解一

map

map是对RDD中的每个元素都执行一个指定的函数来产生一个新的RDD,RDD之间的元素是一对一关系。

>>> x = sc.parallelize([1,2,3,4])
>>> y = x.map(lambda x:(x**3))
>>> y.collect()
[1, 8, 27, 64]

filter

对RDD元素进行过滤,返回一个新的数据集,由经过func函数后返回值为true的原元素组成。

>>> y = x.filter(lambda x:x>2)
>>> y.collect()
[3, 4]   

flatMap

类似于map,但是每一个输入元素会被映射为0到多个输入元素,RDD之间的元素是一对多关系。

>>> y = x.flatMap(lambda x:(x,x*100,x**2))
>>> y.collect()
[1, 100, 1, 2, 200, 4, 3, 300, 9, 4, 400, 16]

glom

返回一个RDD,它将每个分区中的所有元素合并到一个列表中。数据集切分

>>> a = sc.parallelize([1,2,3,4],2)
>//第二个参数2,表示数据集切分的份数(slices)。Spark将会在集群上为每一份数据起一个任务。 
>>>> y = a.glom() 
>>>> y.collect() [[1, 2], [3, 4]] 

mapPartitions

mapPartitions 函 数 获 取 到 每 个 分 区 的 迭 代器,在 函 数 中 通 过 这 个 分 区 整 体 的 迭 代 器 对整 个 分 区 的 元 素 进 行 操 作

>>> xx = sc.parallelize([1,2,3,4], 2) 
>>> def f(iter): ...  
           yield sum(iter) ...  
>>> yy = xx.mapPartitions(f)
>>> print 'xx原来分区信息:{0}'.format(xx.glom().collect()) xx原来分区信息:[[1, 2], [3, 4]] 
>>> print 'xx经过f计算后的结果:{}'.format(yy.glom().collect()) xx经过f计算后的结果:[[3], [7]] 

distinct

distinct将RDD中的元素进行去重操作

>>> res = sorted(sc.parallelize([1, 1, 1, 2, 3, 2, 3]).distinct().collect()) 
>>> print '去重后的结果:{}'.format(res) 去重后的结果:[1, 2, 3] 

union 并集

>>> rdd = sc.parallelize([1, 1, 2, 3])
>>> rdd1 = sc.parallelize([5, 3, 4, 6])
>>> print rdd.union(rdd1).collect()
[1, 1, 2, 3, 5, 3, 4, 6] 


intersection 交集

>>> rdd = sc.parallelize([1, 1, 2, 3])
>>> rdd1 = sc.parallelize([5, 3, 4, 6])
>>> print rdd.intersection(rdd1).collect()
[3]

cartesian

返回两个rdd的笛卡尔积。
笛卡尔积是什么不懂得可以参考下面的微博

>>> rdd = sc.parallelize([1, 2])
>>> rdd_1 = sc.parallelize([3,4])
>>> rdd.cartesian(rdd_1).collect()
[(1, 3), (1, 4), (2, 3), (2, 4)]  

groupBy

groupBy算子接收一个函数,这个函数返回的值作为key,然后通过这个key来对里面的元素进行分组。

val a = sc.parallelize(1 to 9, 3)
a.groupBy(x => { if (x % 2 == 0) "even" else "odd" }).collect
//返回的even或者odd字符串作为key来group RDD里面的值,
res42: Array[(String, Seq[Int])] = Array((even,ArrayBuffer(2, 4, 6, 8)), (odd,ArrayBuffer(1, 3, 5, 7, 9)))

val a = sc.parallelize(1 to 9, 3)
def myfunc(a: Int) : Int =
{
  a % 2
}
a.groupBy(myfunc).collect //同样的,返回的是0的时候,表示的是偶数值,返回的是1的时候表示的是奇数。
res3: Array[(Int, Seq[Int])] = Array((0,ArrayBuffer(2, 4, 6, 8)), (1,ArrayBuffer(1, 3, 5, 7, 9)))

猜你喜欢

转载自blog.csdn.net/qq_43688472/article/details/85640089