現在我們來實現在自定義程序中編寫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}