个人随笔
目录
用Scala模仿SparkContext 的map,filter 算子调用写一个例子
2019-12-13 23:10:54

一直觉得Spark的算子调用超级厉害,弄不懂怎么样让传入map的函数作用在一个个值之上的,比如Spark的算子调用模式:

  1. rdd.map(word=>(word,1)).reduceByKey((a,b)=>a+b).foreach(println)

两年来,我一直搞不明白,为何xxx.map(word=>(word,1))就可以把xxx里面的内容全部都变成map返回。可能是因为做惯了面向对象java,对这种面相函数的编程有点晕。现在想想,真的是太简单的,不就是:word=>(word,1) 这个匿名函数处理xxx对象中的属性嘛!

这里用Scala模仿SparkContext 的map,filter 算子调用写一个例子,让我们体会下Scala面向函数编程的快感:

  1. import scala.collection.mutable.ListBuffer
  2. /**
  3. * 定义SparkContext
  4. */
  5. class SparkContext {
  6. //传入一个k可变的List,创建RDD
  7. def creatRDD(list:ListBuffer[Int]):RDD={
  8. return new RDD(list)
  9. }
  10. }
  11. /**
  12. * 定义RDD
  13. * @param list
  14. */
  15. class RDD(list:ListBuffer[Int]){
  16. /**
  17. * 定义map算子
  18. * @param f map算子传入的处理函数
  19. * @return
  20. */
  21. def map(f:Int=>Int):RDD={
  22. var li = ListBuffer[Int]();
  23. for(i<-list){
  24. val j =f(i)
  25. li+=j;
  26. }
  27. return new RDD(li);
  28. }
  29. /**
  30. * 定义过来filter算子
  31. * @param f
  32. * @return
  33. */
  34. def filter(f:Int=>Boolean):RDD={
  35. var li = ListBuffer[Int]();
  36. for(i<-list){
  37. val j =f(i)
  38. if(j){
  39. li+=i;
  40. }
  41. }
  42. return new RDD(li);
  43. }
  44. /**
  45. * 遍历方法
  46. */
  47. def show():Unit={
  48. for(l<-list){
  49. println(l)
  50. }
  51. }
  52. }
  53. object SparkContext{
  54. def apply(): SparkContext = new SparkContext()
  55. def main(args: Array[String]): Unit = {
  56. var sc = SparkContext()
  57. val list = ListBuffer(1,2,3,4,5)
  58. val rdd = sc.creatRDD(list)
  59. println("--------------初始值------------")
  60. rdd.show();
  61. println("--------------每个元素+1------------")
  62. val rdd2 = rdd.map((x:Int)=>x+1);
  63. rdd2.show()
  64. println("---------------每个元素+9-----------")
  65. val rdd3 = rdd.map((x:Int)=>x+9);
  66. rdd3.show()
  67. println("----------------取出大于等于4的元素----------")
  68. val rdd4 = rdd.filter((x:Int)=>x>=4)
  69. rdd4.show()
  70. }
  71. }

当然,可能用的参数不太正确,我用的是可变的List,不过也成功实现了map和filter的调用模式。

运行结果如下

  1. --------------初始值------------
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. --------------每个元素+1------------
  8. 2
  9. 3
  10. 4
  11. 5
  12. 6
  13. ---------------每个元素+9-----------
  14. 10
  15. 11
  16. 12
  17. 13
  18. 14
  19. ----------------取出大于等于4的元素----------
  20. 4
  21. 5
  22. Process finished with exit code 0
 585

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2