PySpark API使用

rdd Transformation操作:用于创建新的RDD(返回类型RDD),eg:map、mapPartitions、Filter、groupBy等.
# 只是定义操作,获取最终的结果需要调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)
pyspark中字典操作:
# 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)

猜你喜欢

转载自www.cnblogs.com/luckyboylch/p/12553506.html