Spark機(jī)器學(xué)習(xí)實(shí)戰(zhàn)(一)Spark的環(huán)境搭建與簡單銷售統(tǒng)計應(yīng)用
之前寫了一個從零開始學(xué)習(xí)Spark的系列损敷,一共八篇文章被辑,了解了基本的Scala語言墨林,RDD操作巍沙。接下來準(zhǔn)備再開一個專題饥伊,記錄一下Spark用于機(jī)器學(xué)習(xí)的實(shí)戰(zhàn)Project象浑,目的是將Spark和機(jī)器學(xué)習(xí)用于各個數(shù)據(jù)集的實(shí)戰(zhàn)中。
第一部分還是用一個很簡單的例子來配通Spark的環(huán)境撵渡,大致過程與從零開始學(xué)習(xí)Spark(一)環(huán)境配置融柬,實(shí)現(xiàn)WordCount一致,只是為了完整性再記錄一下趋距。
Spark可以運(yùn)行在各種集群上粒氧,但在這里我們都運(yùn)行在本地,所以數(shù)據(jù)集的規(guī)模不會太龐大节腐。
這個系列的文章會完成一個完整的系統(tǒng):利用機(jī)器學(xué)習(xí)為一個電影網(wǎng)站提供數(shù)據(jù)支持外盯。文章中列出了關(guān)鍵代碼摘盆,完整代碼見我的github repository,這篇文章的代碼在
chapter01
中
任務(wù)目標(biāo)
這一部分的例子非常簡單饱苟,數(shù)據(jù)集是一個銷售報表孩擂,格式為:用戶名,商品名稱箱熬,價格类垦,我們需要統(tǒng)計總售貨數(shù),用戶數(shù)量城须,總收入蚤认,以及商品銷量排行。數(shù)據(jù)如下:
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
第1步:配置sbt在IntelliJ下編程環(huán)境
打開terminal
查看java版本糕伐,由于MacOS自帶java砰琢,因此無需安裝
$ java -version
安裝sbt,這是編譯scala的工具
$ brew install sbt
查看sbt與scala信息
$ sbt about
下載安裝IntelliJ
安裝Scala Plugin:打開IntelliJ良瞧,在選擇項(xiàng)目界面陪汽,選擇Configure → Plugins → Install JetBrains Plugins,搜索Scala并安裝
選擇默認(rèn)SDK:Configure → Project defaults → Project structure褥蚯,SDK選擇Java1.8
至此scala在IntelliJ下的開發(fā)環(huán)境配置完畢
第2步:配置Spark工具包
下載Spark:下載地址挚冤,注意如果已經(jīng)安裝了Hadoop的話要下載對應(yīng)的版本,下面的命令可以查看Hadoop版本
$ hadoop version
下載完畢后解壓并將其放在一個目錄下赞庶,假設(shè)放在/usr/shar/spark-2.1.0-bin-hadoop2.7
你辣,那么我們往環(huán)境變量中添加Spark方便以后使用
$ vim .bash_profile
加入一行,保存后重啟terminal即可
export SPARK_HOME=/usr/shar/spark-2.1.0-bin-hadoop2.7
至此尘执,Spark環(huán)境配置完畢舍哄,是不是非常方便
第3步:構(gòu)建我們的應(yīng)用
首先,IntelliJ下創(chuàng)建sbt項(xiàng)目:打開IntelliJ → Create New Project → Scala → sbt → ProjectName = chapter01 → Create
修改build.sbt誊锭,在最后加入一行Spark的包表悬。注意scalaVersion一定要改成2.11,因?yàn)镾park2.1.0是基于Scala2.11的丧靡,默認(rèn)的2.12會報錯蟆沫!
name := "chapter01"
version := "1.0"
scalaVersion := "2.11.7"
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.1.0"
讓我們先來看一下sbt項(xiàng)目的目錄結(jié)構(gòu)
├── build.sbt
├── project
│ ├── build.properties
│ ├── plugins.sbt
│ ├── project
│ └── target
├── src
│ ├── main
│ │ ├── java
│ │ ├── resources
│ │ ├── scala
│ │ └── scala-2.12
│ └── test
│ ├── java
│ ├── resources
│ ├── scala
│ └── scala-2.12
└── target
├── resolution-cache
├── scala-2.12
└── streams
我們首先將我們的數(shù)據(jù)集放在一個新建的data目錄中,/data/UserPurchaseHistory.csv
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
我們需要寫的代碼主要放在/src/main/scala
里面
下一步温治,我們開始寫我們的代碼饭庞,具體細(xì)節(jié)不用深究,本章節(jié)只是為了配通環(huán)境
添加文件/src/main/scala/ScalaApp.scala
/**
* Created by c on 2017/5/28.
*/
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
object ScalaApp {
def main(args: Array[String]) {
val sc = new SparkContext("local[2]", "First Spark App")
val data = sc.textFile("data/UserPurchaseHistory.csv")
.map(line => line.split(','))
.map(purchaseRecord => (purchaseRecord(0), purchaseRecord(1), purchaseRecord(2)))
val numPurchases: Long = data.count()
val uniqueUsers: Long = data.map { case (user, product, price) => user }.distinct.count()
val totalRevenue: Double = data.map { case (user, product, price) => price.toDouble }.sum()
val productsByPopularity = data.map { case (user, product, price) => (product, 1) }
.reduceByKey((x, y) => x + y).sortByKey(ascending=false).collect()
val mostPopular = productsByPopularity(0)
println("Total purchases: " + numPurchases)
println("Unique users: " + uniqueUsers)
println("Total revenue: " + totalRevenue)
println("Most popular product: %s with %d purchases".
format(mostPopular._1, mostPopular._2))
}
}
此時熬荆,我們在IntelliJ中的ScalaApp.scala代碼瀏覽界面的object旁可以看到一個按鈕舟山,按一下就可以直接run了
下方Console中出現(xiàn)如下結(jié)果證明運(yùn)行成功
Total purchases: 5
Unique users: 4
Total revenue: 39.91
Most popular product: iPhone Cover with 2 purchases