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()
  }

 

你可能感兴趣的:(Spark教程)