Spark初體驗(1)--SparkPi詳解

先貼出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.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章