編程的兩種方式執行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}

發佈了33 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章