1. 程式人生 > >SparkSQL入門案例之一

SparkSQL入門案例之一

SparkSQL 1.x和2.x的程式設計API有一些變化,企業中都有使用,所以這裡兩種方式都將使用案例進行學習

先使用SparkSQL1.x的案例

開發環境跟之前開發SparkCore程式的一樣,IDEA+Maven+Scala

1.匯入SparkSQL的pom依賴

在之前的博文  Spark案例之根據ip地址計算歸屬地中的pom依賴中加上下面的依賴即可

<dependency>
       <groupId>org.apache.spark</groupId>
       <artifactId>spark-sql_2.11</artifactId>
       <version>${spark.version}</version>
</dependency>

2.具體程式碼實現,因為程式碼中已經有很詳細的說明了,所以這裡就直接放出來了

package cn.ysjh0014.SparkSql

import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, SQLContext}
import org.apache.spark.{SparkConf, SparkContext}

object SparkSqlDemo1 {

  def main(args: Array[String]): Unit = {

    //這個程式可以提交到Spark叢集中
    val conf = new SparkConf().setAppName("SparkSql").setMaster("local[4]") //這裡的setMaster是為了在本地執行,多執行緒執行

    //建立Spark Sql的連線
    val sc = new SparkContext(conf)
    //SparkContext不能建立特殊的RDD,將Spark Sql包裝進而增強
    val SqlContext = new SQLContext(sc)

    //建立DataFrame(特殊的RDD,就是有schema的RDD),先建立一個普通的RDD,然後再關聯上schema
    val lines = sc.textFile(args(0))

    //將資料進行處理
    val boyRdd: RDD[Boy] = lines.map(line => {
      val fields = line.split(",")
      val id = fields(0).toLong
      val name = fields(1)
      val age = fields(2).toInt
      val yz = fields(3).toDouble
      Boy(id,name,age,yz)
    })
    //該RDD裝的是Boy型別的資料,有了schema資訊,但是還是一個RDD,所以應該將RDD轉換成DataFrame
    //匯入隱式轉換
    import SqlContext.implicits._
    val df: DataFrame = boyRdd.toDF

    //變成DataFrame後就可以使用兩種API進行程式設計了

    //1.使用SQL的方式
    //把DataFrame註冊成臨時表
    df.registerTempTable("body") //過時的方法
    //書寫SQL(sql方法其實是Transformation)
    val result: DataFrame = SqlContext.sql("SELECT * FROM body ORDER BY yz desc, age asc")         //注意:  這裡的SQL語句該大寫的必須大寫
    //檢視結果(出發Action)
    result.show()


    //釋放資源
    sc.stop()

  }
}

case class Boy(id: Long, name: String, age: Int, yz: Double)      //樣例類

3.建立測試資料

建立一個txt檔案,然後在裡面輸入以下資料

1,zhangsan,15,99
2,lisi,16,98
3,wangwu,20,100
4,xiaoming,11,97
5,xioali,8,92

4.執行測試

在執行前傳入引數args(0)

執行結果:

可以看出輸出結果是以一張表的形式展現的