# 只是定义操作,获取最终的结果需要调rdd.collect()、rdd.count()等获取rdd信息的函数,才会真正执行定义的函数.有点类似于tensorflow中定义的计算图. 要求func有返回值,否则需要像foreachPartition底层那样包装下才能执行count()等.
rdd = rdd.mapPartitions(func)
rdd Action操作:用于RDD的操作(返回类型为None),它指示Spark执行计算并将结果发送回驱动程序. eg:foreach、foreachPartition、count等. 底层均调的mapPartitions
# 直接执行自定义函数
rdd.foreachPartition(func)
# rdd不支持操作字典,并且sc.parallelize函数的参数c一般均传的list
若想最终map操作后得到一个字典有以下两种方法:
方法1:func返回[(key1,val1),(key2,val2),...],即类似namedtuple(推荐)
def func(arr):
res = []
for val in arr:
res.append((str(val), val))
return res
values = list(range(20))
rdd = sc.parallelize(values, numSlices=4)
rdd = rdd.mapPartitions(func)
res = rdd.collectAsMap() # rdd.collect()返回的是list,若rdd为字典则会返回list(keys)
方法2:func返回[dict]
def func(arr):
res = {}
for val in arr:
res[str(val)] = val
return [res]
values = list(range(20))
rdd = sc.parallelize(values, numSlices=4)
rdd = rdd.mapPartitions(func)
res = rdd.collect()
result = {}
for val in res:
result.update(val)