pyspark 浅析

Spark的scala也好, 还是pyspark也好, 它们的编程思想都是函数式编程, 关于函数式编程的解析可以看这篇文章:

http://www.ruanyifeng.com/blog/2012/04/functional_programming.html

函数式编程只是返回新的值, 不修改原有的值, 所以在对RDD操作时一定要注意, 不要用对RDD操作以后, 引用了老的变量.

import pyspark

sc = pyspark.SparkContext()

rdd = sc.parallelize([1, 2, 3, 4, 5, 6, -1, 0])
rdd.sortBy(lambda x: x)
print rdd.collect()  # not ordered, because you are referencing the original variable 'rdd'

rdd = sc.parallelize([1, 2, 3, 4, 5, 6, -1, 0])
rdd.sortBy(lambda x: x).persist()
print rdd.collect()  # not ordered, same reason as above

rdd = sc.parallelize([1, 2, 3, 4, 5, 6, -1, 0])
print rdd.sortBy(lambda x : x).collect() # ordered 

collect函数的作用把RDD的收集到当前的节点上, 注意如果RDD过大, 可能当前节点内存不能存放RDD,导致报错

Spark driver 是用来解析用户提交的代码, 并把这些代码转换成集群要执行的任务. 把这些任务交给master来分发执行.

master可以有很多选择, 比如yarn就是一个master

pyspark --master yarn --queue queue1 --deploy-mode client

通过配置spark-site.xml的HADOOP_CONF_DIR就能让spark知道yarn的访问路径

Spark 还分 client 模式和 cluster 模式, 详见: 

https://blog.csdn.net/SummerMangoZz/article/details/72627518

https://blog.csdn.net/Trigl/article/details/72732241

Spark也有类似hadoop中分布式缓存的实现, 叫broadcast variables.

Spark中有一个全局计数的实现叫Accumulators

Spark的map可以基于每一行, 去应用lambda表达式对各个元素进行转换, 也可以基于Partition来去转换, 以节省数据库的链接这样宝贵的资源.

reduce里指定的变换函数, 返回的结果必须和序列的元素的结构一致, 因为reducer的原理是 把第一个和第二个元素的转换结果和第三个元素再一起转换:

import pyspark

sc = pyspark.SparkContext()

rdd = sc.parallelize([1, 2, 3], 1)
# calculate the mean value
#the lambda function must return the same structure 
print reduce( lambda x,y: x/y,rdd.map(lambda x: [x, 1.0]).reduce(lambda x,y:[x[0]+y[0],x[1]+y[1]])) 

猜你喜欢

转载自blog.csdn.net/rav009/article/details/81064654