前言
Spark是企業中用的比較多的大數據計算框架,它主要由 SparkCore、SparkSQL、SparkStreaming 這三個模塊組成,實時計算主要使用 SparkStreaming,離線部分的數據處理則主要使用SparkSQL。開發 SparkSQL 程序的一般流程是:讀取 HDFS 上的文件 => 裝換成 RDD => 註冊成臨時表 => 調用 SparkSQL 的 API 編寫 spark sql 查詢語句進行計算 => 將結果存入 mysql 數據庫。
一、開發環境搭建
可以使用 IDEA 或 Scala IDE,以 IDEA 爲例:
PS:建議大家使用 IDEA,之前博主下載使用過 ScalaIDE,寫代碼的時候都沒法自動導包,影響開發效率。
1. 下載 IDEA
下載地址:https://www.jetbrains.com/idea/download/#section=windows
2. 下載Scala
下載地址:https://www.scala-lang.org/download/all.html
博主用的版本是2.11.8
3. IDEA上安裝Scala插件
File => Settings => Plugins => 右側搜索框輸入Scala => 查詢出的結果點擊 Install
(博主是因爲已經安裝過了所以纔會出現 Installed,沒安裝過的那個按鈕應該是像下圖中的綠色的按鈕那樣)
4. 創建Maven項目
創建Maven項目:File => new => Project => Maven Project => Next => Next => Finish
5. 在library中添加Scala的SDK
默認會有一個 Java 的 SDK,因爲我們要使用 Scala 語言來寫 Spark 項目,所以還要添加一個 Scala SDK。
File => Project Structure => Project Settings => Libraries => + => Scala SDK => Browse => 選中下載好的 scala所在的目錄 => 點擊OK
就會發現我們的 External Libraries 下多了一個 Scala SDK,然後我們就可以在項目中右擊創建 Scala 類了
右擊 => New => Scala Class => 選擇Object,輸入類名 => 確定
二、代碼部分
1. pom依賴
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<scala.version>2.11.8</scala.version>
<spark.version>2.1.0</spark.version>
<encoding>UTF-8</encoding>
</properties>
<dependencies>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>${scala.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.25</version>
</dependency>
</dependencies>
2. 模擬數據文件
1 王根基 18
2 張三 23
3 李四 78
4 二狗 23
5 大帥 43
6 小王 28
7 麻子 88
8 小劉 45
3. spark代碼
import org.apache.log4j.{Level, Logger}
import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession
object Demo {
def main(args: Array[String]): Unit = {
// 下面這行代碼是設置Hadoop的Home目錄,在Hadoop的Home目錄的bin目錄中需要放一個winUtil工具
// 不添加的話在運行代碼的過程中,會拋出一個異常,雖然不影響程序向下執行,但是看着不舒服,可以不寫
System.setProperty("hadoop.home.dir", "F:/hadoop-2.7.3")
// 設置Spark打印日誌的級別,把他設爲ERROR級別,避免運行過程中大量的日誌覆蓋程序的運行結果,可以不寫
Logger.getLogger("org.apache.spark").setLevel(Level.ERROR)
// 創建SparkConf
val conf = new SparkConf()
conf.setAppName("demo2")
conf.setMaster("local")
// 創建SparkSession
val spark = SparkSession.builder().config(conf).getOrCreate()
val sc = spark.sparkContext
spark.sparkContext.setLogLevel("WARN")
// 從指定的文件中讀取數據,生成對應的RDD
val lineRDD = sc.textFile("e:/student.txt").map(_.split(" "))
// 將RDD和case class關聯
val studentRDD = lineRDD.map(x=>Student(x(0).toInt, x(1), x(2).toInt))
// 生成DataFrame,通過RDD生成DF,導入隱式轉換
import spark.sqlContext.implicits._
val studentDF = studentRDD.toDF()
// 註冊表視圖
studentDF.createOrReplaceTempView("student")
// 執行SQL
spark.sql("select * from student").show
spark.stop
}
}
// case class 一定放在外面
case class Student(stuID: Int, stuName: String, stuAge: Int)
4. 右擊 Run 運行代碼即可
關注我的微信公衆號(曲健磊的個人隨筆),獲取更多幹貨: