使用Scala进行Spark-GraphX编程

GraphX是基于Spark实现的一个图计算框架,能够对图进行建模。GraphX内置了一些实用的方法,如PageRank、SCC等,同时也提供了Pregel算法的API,我们可以利用Pregel来实现自己的一些图算法。目前GraphX似乎还没有实用的Python API,比较方便的是借助Scala。
Scala和Kotlin、Clojure等一样是一种jvm语言,传说其复杂度可与C++一较高下。用下来感觉并不舒服,虽然Scala自诩FP,但从中感到更多的是Java的沉闷与拘束。

Scala语言特性概览

FP方面

柯里化

Scala函数都是柯里函数,因此支持链式地调用,也支持偏/部分应用(注意偏/部分应用和部分函数是两个概念)

模式匹配

Scala使用case来实现类似guard的机制。

解构绑定

Scala可以利用样本类case class来实现对象的解构绑定。
case class实际上可以看做对class的语法糖,根据Scala的说明,case class的使用场景就是用来做Structured binding的。

高阶函数

使用compose可以实现复合函数

scala> (((x: Int) => x + 1) compose ((y: Int) => y * 2)).apply( 11 )
res1: Int = 23

OO方面

逆变与协变

Spark部分

RDD

RDD(Resilient Distributed Dataset),即弹性数据集是Spark中的基础结构。RDD是distributive的、immutable的,可以存在在内存中,也可以被缓存。
对RDD具有转换操作和行动操作两种截然不同的操作。

  1. 转换操作始终在RDD的Context里面,但行动操作会去掉RDD的Context
    例如take是行动操作,返回的是一个数组而不是RDD了,在Scala中可以看到

    1
    2
    3
    4
    5
    6
    7
    8
    scala> var rdd1 = sc.makeRDD(Seq(10, 4, 2, 12, 3))
    rdd1: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[40] at makeRDD at :21
    scala> rdd1.take(1)
    res0: Array[Int] = Array(10)
    scala> rdd1.take(2)
    res1: Array[Int] = Array(10, 4)
  2. 转换操作是Lazy Evaluate的,直到遇到一个行动操作

GraphX部分