Spark機(jī)器學(xué)習(xí)實(shí)戰(zhàn)(一)Spark的環(huán)境搭建與簡(jiǎn)單銷售統(tǒng)計(jì)應(yīng)用

Spark機(jī)器學(xué)習(xí)實(shí)戰(zhàn)(一)Spark的環(huán)境搭建與簡(jiǎn)單銷售統(tǒng)計(jì)應(yīng)用

之前寫了一個(gè)從零開始學(xué)習(xí)Spark的系列,一共八篇文章,了解了基本的Scala語言,RDD操作。接下來準(zhǔn)備再開一個(gè)專題,記錄一下Spark用于機(jī)器學(xué)習(xí)的實(shí)戰(zhàn)Project,目的是將Spark和機(jī)器學(xué)習(xí)用于各個(gè)數(shù)據(jù)集的實(shí)戰(zhàn)中。

第一部分還是用一個(gè)很簡(jiǎn)單的例子來配通Spark的環(huán)境,大致過程與從零開始學(xué)習(xí)Spark(一)環(huán)境配置,實(shí)現(xiàn)WordCount一致,只是為了完整性再記錄一下。

Spark可以運(yùn)行在各種集群上,但在這里我們都運(yùn)行在本地,所以數(shù)據(jù)集的規(guī)模不會(huì)太龐大。

這個(gè)系列的文章會(huì)完成一個(gè)完整的系統(tǒng):利用機(jī)器學(xué)習(xí)為一個(gè)電影網(wǎng)站提供數(shù)據(jù)支持。文章中列出了關(guān)鍵代碼,完整代碼見我的github repository,這篇文章的代碼在chapter01

任務(wù)目標(biāo)

這一部分的例子非常簡(jiǎn)單,數(shù)據(jù)集是一個(gè)銷售報(bào)表,格式為:用戶名,商品名稱,價(jià)格,我們需要統(tǒng)計(jì)總售貨數(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的話要下載對(duì)應(yīng)的版本,下面的命令可以查看Hadoop版本

$ hadoop version

下載完畢后解壓并將其放在一個(gè)目錄下,假設(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會(huì)報(bào)錯(cuò)!

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ù)集放在一個(gè)新建的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))
  }
}

此時(shí),我們?cè)贗ntelliJ中的ScalaApp.scala代碼瀏覽界面的object旁可以看到一個(gè)按鈕,按一下就可以直接run了

run project

下方Console中出現(xiàn)如下結(jié)果證明運(yùn)行成功

Total purchases: 5
Unique users: 4
Total revenue: 39.91
Most popular product: iPhone Cover with 2 purchases
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容