1. 程式人生 > >程式設計的兩種方式執行Spark SQL查詢(方式一)

程式設計的兩種方式執行Spark SQL查詢(方式一)

現在我們來實現在自定義程式中編寫Spark SQL查詢程式。

實現查詢的方式有兩種:

方式一:通過反射推斷schema。

方式二:通過structtype直接指定schema。

我們先用方式一來實現自定義查詢。

首先建立一個team.txt檔案,內容有5列,分別是id,球隊名稱,綜合值,進攻值,防守值。

部分資料如下:

1,火箭,94,95,93
2,馬刺,95,96,94
3,灰熊,92,94,90
4,勇士,99,99,98
5,湖人,72,75,69
6,猛龍,86,85,87

特別說明:team.txt檔案一定要用UTF-8的格式儲存,否則計算結果中文字元會出現亂碼。

開啟虛擬機器叢集,我這裡是三臺機器:hadoop001、hadoop002、hadoop003。

使用RZ命令將team.txt檔案上傳到虛擬機器,通過hdfs命令操作將檔案儲存到hdfs儲存介質中。

hdfs dfs -put /home/hadoop/files/player/team1.txt input/team1.txt

接下來,在maven專案的pom.xml中新增Spark SQL的依賴。

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-sql_2.10</artifactId>
    <version>1.6.1</version>
</dependency>
編寫程式程式碼:
package cn.allengao.sparksql

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

/**
  * class_name:
  * package:
  * describe: SparkSql通過反射推斷schema
  * creat_user: Allen Gao
  * creat_date: 2018/2/5
  * creat_time: 9:53
  **/
object InferringSchema {
  def main(args: Array[String]): Unit = {
    //1、模板程式碼
    val conf = new SparkConf().setAppName("SQL-typeOne").setMaster("local[*]")
    val sc = new SparkContext(conf)
    val sqlContext = new SQLContext(sc)
    //2、獲取資料
    val linesRDD = sc.textFile(args(0)).map(_.split(","))
    //3、將RDD和case class進行關聯
    val teamRDD = linesRDD.map(x => PlayTeam(x(0).toInt, x(1), x(2).toInt, x(3).toInt,x(4).toInt))
    //4、建立DataFrame
    import sqlContext.implicits._
    val teamDF = teamRDD.toDF

    //5、登錄檔
    teamDF.registerTempTable("t_team")
    //6、查詢
    val df = sqlContext.sql("select * from t_team order by colligate desc limit 3")
    //7、輸出
    df.write.json(args(1))

    sc.stop()
  }
}
//id 隊名 綜合 進攻 防守
case class PlayTeam(id: Int, name: String, colligate: Int, attack: Int,defense:Int)

設定執行引數:hdfs://hadoop001:9000/user/hadoop/input/team.txt hdfs://hadoop001:9000/output/team

執行程式程式碼。

通過WEB頁面開啟hadoop目錄可以看到執行成功的結果檔案:


通過hdfs命令檢視結果檔案:

hdfs dfs -cat hdfs://hadoop001:9000/output/team1/part-r-00000-2dc7028d-5549-4c41-9bfc-c6efe77ad8a4

可以看到如下結果資訊:

{"id":4,"name":"勇士","colligate":99,"attack":99,"defense":98}
{"id":2,"name":"馬刺","colligate":95,"attack":96,"defense":94}
{"id":1,"name":"火箭","colligate":94,"attack":95,"defense":93}