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