Scala版Spark簡單商品統計程式教程--逐行精講
阿新 • • 發佈:2018-12-14
題目是給一點點資料,統計總營業額,最受歡迎的商品啥的,很容易,適合練手:
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() }