spark学习笔记2

(pyspark)

sc.parallelize([1,2,3,4,5,6])

创建出一个可以被并行操作的分布式数据集

mapPartitions(func) 

func应用于RDD的每个分区上,所以func的输入是一个block

>>> def squareFunc(a):
. . .     for i in a:
. . .         yield i*i
. . .
>>> a = sc.parallelize(range(10), 3)
PythonRDD[1] at RDD at PythonRDD.scala:48
>>> a.mapPartitions(squareFunc).collect()
比如,将RDD中的所有数据通过JDBC连接写入数据库,如果使用map函数,可能要为每一个元素都创建一个connection,这样开销很大,如果使用mapPartitions,那么只需要针对每一个分区建立一个connection。
>>> def func(index, iterator):  # 返回每个分区的编号和数值
. . .     yield (‘index ‘ + str(index) + ’ is: ‘ + str(list(iterator)))
. . .
>>> a = sc.parallelize(range(10),3)
>>> a.mapPartitionsWithIndex(func).collect()
sample(withReplacement, fraction, seed) 
data1.union(data2).collect()
data1.intersection(data2).collect()
去除数据集中的重复元素。

 
 

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

该函数和map函数类似,只不过映射函数的参数由RDD中的每一个元素变成了RDD中每一个分区的迭代器。如果在映射的过程中需要频繁创建额外的对象,使用mapPartitions要比map高效的过。

 
 


mapPartitionsWithIndex(func) 

mapPartitions比func多了个参数,就是block的index

['index 0 is: [0, 1, 2]', 'index 1 is: [3, 4, 5]', 'index 2 is: [6, 7, 8, 9]']


从数据中抽样,withReplacement表示是否有放回,withReplacement=true表示有放回抽样,fraction为抽样的概率(0<=fraction<=1),seed为随机种子。

sample = data.sample(True, 0.2)

注意:1.Spark中的sample抽样,当withReplacement=True时,相当于采用的是泊松抽样;当withReplacement=False时,相当于采用伯努利抽样,

2.fraction并不是表示抽样得到的样本占原来数据总量的百分比,而是一个元素被抽取为样本的概率。fraction=0.2并不是说明要抽出100个数字中20%的数据作为样本,而是每个数字被抽取为样本的概率为0.2,这些数字被认为来自同一总体,样本的大小并不是固定的,而是服从二项分布。


data1.union(data2).collect()

保留重复元素的取并集

data1.intersection(data2).collect()

取交集

distinct([numTasks])

去除数据集中的重复元素。 

groupByKey([numTasks]) 

作用于由键值对(K, V)组成的数据集上,将Key相同的数据放在一起,返回一个由键值对(K, Iterable)组成的数据集。 

如果这一操作是为了后续在每个键上进行聚集(aggregation),比如sum或者average,此时使用reduceByKey或者aggregateByKey的效率更高

reduceByKey(func, [numTasks]) 

作用于键值对(K, V)上,按Key分组,然后将Key相同的键值对的Value都执行func操作,得到一个值,注意func的类型必须满足


aggregate(zeroValue,seq,comb,taskNums)

将初始值和第一个分区中的第一个元素传递给seq函数进行计算,然后将计算结果和第二个元素传递给seq函数,直到计算到最后一个值。第二个分区中也是同理操作。最后将初始值、所有分区的结果经过combine函数进行计算(先将前两个结果进行计算,将返回结果和下一个结果传给combine函数,以此类推),并返回最终结果。

>>> data = sc.parallelize((1,2,3,4,5,6),2)
>>> def seq(a,b):
...     print 'seqOp:'+str(a)+"\t"+str(b)
...     return min(a,b)
... 
>>> def combine(a,b):
...     print 'comOp:'+str(a)+"\t"+str(b)
...     return a+b
... 
>>> data.aggregate(3,seq,combine)
seqOp:3  1
seqOp:1  2
seqOp:1  3
seqOp:3  4
seqOp:3  5
seqOp:3  6
comOp:3  1
comOp:4  3
7

>>>

aggregateByKey(zeroValue,seq,comb,taskNums)

先对每个value用seq操作,seq的参数是zeroValue和这个value

然后分组的用comb函数对每个key的一组新value进行reduce操作

>>> data = sc.parallelize([(1,3),(1,2),(1,4),(2,3)])
>>> def seq(a,b):
...     return max(a,b)
... 
>>> def combine(a,b):
...     return a+b
... 
>>> data.aggregateByKey(3,seq,comb,4).collect()

[(1, 10), (2, 3)]

先用seq处理变成(1,3),(1,3),(1,4),(2,3)

再按key分组用comb处理key=1的组3+3+4=10


sortByKey([ascending=True], [numTasks]) 

按照Key进行排序,ascending的值默认为True,True/False表示升序还是降序 


 join(otherDataset, [numTasks]) 
类似于SQL中的连接操作,即作用于键值对(K, V)和(K, W)上,返回元组 (K, (V, W)),spark也支持外连接,包括leftOuterJoin,rightOuterJoin和fullOuterJoin。

猜你喜欢

转载自blog.csdn.net/rona1/article/details/79814975