1. 程式人生 > >Scala版Spark簡單商品統計程式教程--逐行精講

Scala版Spark簡單商品統計程式教程--逐行精講

題目是給一點點資料,統計總營業額,最受歡迎的商品啥的,很容易,適合練手:

John,iPhone Cover,9.99
John,Headphones,5.49
Jack,iPhone Cover,9.99
Jill,Samsung Galaxy Cover,8.95
Bob,iPad Cover,5.49

第一列人名,第二列商品名,第三列價格。

每行代表一個訂單記錄,把他們複製到一個csv檔案,或者txt啥的隨意了2333,放在程式碼中的路徑下:

全部程式碼如下:

import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._

object MyTest{

  def main(args: Array[String]) {

    //local[4]可以認為是把資料分為4個塊,單機的話,可以理解為放在程序的不同執行緒下
    //這樣就可以平行計算啦,sparkcontext可以認為是一個必備的初始化。
    val sc = new SparkContext("local[4]", "My Test Code")
    
    //這句話是把資料讀入,然後轉化成一個三元組的資料格式。
    //testFile是通過剛剛初始化的sc讀取相應資料,=>可以認為是一個函式,左邊代表輸入,右邊表
    //對輸入進行這樣的操作,map的意思就是對所有輸入都進行這樣的操作。
    //第二行翻譯過來就是,以“,”位分割符,把每一行分隔成字串。
    //同理,第三行翻譯過來就是,把第一列,第二列,第三列打包成一個元組。
    val data = sc.textFile("./src/main/scala/ma/purchas.csv")
      .map(line => line.split(","))
      .map(purchaseRecord => (purchaseRecord(0), purchaseRecord(1), purchaseRecord(2)))

    //這裡就是簡單的計數,統計一共有多少條,這句話是計算訂單總數的
    val numPurchases = data.count()

    //case是scala語言模式匹配的關鍵字,意思是符合(user, product, price)這樣條目,轉化為user,
    //然後去重,最後計數,這句話是計算有多少不同使用者的。
    val uniqueUsers = data.map { case (user, product, price) => user }.distinct().count()

    //這裡多了一個price.toDouble,就是轉化為浮點數啦,因為後面要求平均,為了精確,這句話是計算總        
    //收入的
    val totalRevenue = data.map { case (user, product, price) => price.toDouble }.sum()

    //z這一句比較酸爽23333,功能是要計算最暢銷的產品,
    //首先map一行,就是把匹配的元素,轉化為後面的形式,包括產品名和1,因為每個訂單代表購買一次嘛
    //resuceByKey,就是把上一步map的key-value值,通過key相加,也就是這個產品有幾個訂單,value
    //就是幾啦

    //collect,庫函式,返回所有元素
    //sortBy函式說白了就是根據括號裡的要求排序23333,所以括號裡面-_._2是啥?2333
    //-號代表取負值,作用後面再說
    //第一個_代表上一步collect返回的資料集合
    //後面._2是個語法糖,代表上一步RDD第二列的元素,233333
    //所以前面-可以把大正值變成負值返回,從而可以從大到小排序,因為越大正數對應的負值越小嘛。
    val productsByPopularity = data
      .map { case (user, product, price) => (product, 1) }
      .reduceByKey(_ + _)
      .collect()
      .sortBy(-_._2)
    
    println("Total purchases: " + numPurchases)
    println("Unique users: " + uniqueUsers)
    println("Total revenue: " + totalRevenue)
    println("Most popular product: %s with %d purchases".format(productsByPopularity(0)._1, productsByPopularity(0)._2))

    sc.stop()
  }