先贴出SparkPi的代码:
<pre name="code" class="java">import scala.math.random
import org.apache.spark._
/** Computes an approximation to pi */
object SparkPi {
def main(args: Array[String]) {
val conf = new SparkConf().setAppName("Spark Pi")
val spark = new SparkContext(conf)
val slices = if (args.length > 0) args(0).toInt else 2
val n = math.min(100000L * slices, Int.MaxValue).toInt // avoid overflow
val count = spark.parallelize(1 until n, slices).map { i =>
val x = random * 2 - 1
val y = random * 2 - 1
if (x*x + y*y < 1) 1 else 0
}.reduce(_ + _)
println("Pi is roughly " + 4.0 * count / n)
spark.stop()
}
}
该程序的核心代码是:
val count = spark.parallelize(1 until n, slices).map { i =>
val x = random * 2 - 1
val y = random * 2 - 1
if (x*x + y*y < 1) 1 else 0
}.reduce(_ + _)
spark.parallelize(1 until n, slices)
从普通数组创建RDD,里面包含了1到n,这n个数字,它们分别在slices个分区中
map { i =>
val x = random * 2 - 1
val y = random * 2 - 1
if (x*x + y*y < 1) 1 else 0
}
map是对RDD中的每个元素都执行一个指定的函数来产生一个新的RDD。任何原RDD中的元素在新RDD中都有且只有一个元素与之对应。这里的map作用是给出x、y两个随机数,如果这两个数的平方和小于1,该数为1,否则,为0。
reduce(_ + _)
对前面RDD中的元素求和。
核心代码都是Scala编程基础,该方法是计算圆周率的蒙特卡洛法。
Tough times never last, but tough people do.