spark-sql(不包含hive-sql)查詢編程

spark-sql(不包含hive-sql)查詢編程

//1:將json格式的數據轉化爲dataFrame

val df =sqlContext.read.json("hdfs://localhost:9000/jacksoom/people.json")//讀取json格式的數據,轉化爲dataFrame
df.show()//顯示dataFrame內容
df.printSchema()//顯示錶字段格式
df.select("name").show()//查找name的行,顯示
df.select(df("name"), df("age") + 1).show()//查找name和age字段,並將age字段+1處理,然後顯示
df.filter(df("age") > 21).show()//過濾age>21的字段,並顯示
df.groupBy("age").count().show()//對age字段調用groupBy函數,返回年齡和該年齡用戶個數

//2:RDD直接轉化方法dataFrame

case class Person(name: String, age: Int)//創建Person類
val people = sc.textFile("hdfs://localhost:9000/jacksoom/people.txt").map(_.split(",")).map(p => Person(p(0), p(1).trim.toInt)).toDF()//先讀取文件爲RDD,然後制定分隔符,轉化爲RDD[Person]格式,然後使用toDF()轉化爲dataFrame
people.registerTempTable("people")//將該dataFrame註冊表名爲“people”的表
val teenagers = sqlContext.sql("SELECT name, age FROM people WHERE age >= 13 AND age <= 19")//使用sql語言查詢
teenagers.map(t => "Name: " + t(0)).collect().foreach(println)//輸出13=<age<=19的name
teenagers.map(t => "Name: " + t.getAs[String]("name")).collect().foreach(println)//簡單的sql查詢輸出
teenagers.map(_.getValuesMap[Any](List("name", "age"))).collect().foreach(println)//sql查詢

//當轉化爲表的數據個格式不能提前確定的情況,可以由下面三個步驟創建dataFrame

import org.apache.spark.sql.Row;
import org.apache.spark.sql.types.{StructType,StructField,StringType};//依賴jar
val people = sc.textFile("hdfs://localhost:9000/jacksoom/people.txt")//step1:創建RDD
val schemaString = "name age"//定義字段字符串
val schema =StructType(schemaString.split(" ").map(fieldName => StructField(fieldName, StringType, true)))//step2:定義表格式
val rowRDD = people.map(_.split(",")).map(p => Row(p(0), p(1).trim))//
val peopleDataFrame = sqlContext.createDataFrame(rowRDD, schema)//step3:根據表格式和行RDD,創建dataFrame
peopleDataFrame.registerTempTable("people")//註冊表
val results = sqlContext.sql("SELECT name FROM people")//簡單使用spl查詢
results.map(t => "Name: " + t(0)).collect().foreach(println)//對查詢結果進行輸出

//通用的加載/保存功能,在最簡單的形式中,默認的數據源(parquet文件非spark.sql.sources.default需要另外配置),將用於所有操作

val df = sqlContext.read.load("hdfs://localhost:9000/jacksoom/users.parquet")//載入parquet文件,返回爲dataFrame格式
df.select("name", "favorite_color").write.save("hdfs://localhost:9000/jacksoom/namesAndFavColors.parquet")//然後使用查詢,並將查詢結果保存爲相應的parquet文件

//手動指定選項,
//可以手動指定你想使用的數據源,dataSources需要使用完全限定域名(即org.apache.spark.sql.parquet)規定,但是如果是內置的來源,你也可以使用短名稱(eg:josn,parquet,jdbc)。使用此語法,任何類型的數據幀可被轉換成其他類型

val df = sqlContext.read.format("json").load("hdfs://localhost:9000/jacksoom/people.json")//指定讀入的爲json
df.select("name", "age").write.format("parquet").save("namesAndAges.parquet")//sql查找,然後指定保存格式爲parquet

//裝載數據

case class Person(name: String, age: Int)//創建Person類
val people = sc.textFile("hdfs://localhost:9000/jacksoom/people.txt").map(_.split(",")).map(p => Person(p(0), p(1).trim.toInt)).toDF()
people.toDF().write.parquet("hdfs://localhost:9000/jacksoom/test2people.parquet")//將數據寫入test2people.parquet


val df = sqlContext.sql("SELECT name FROM parquet.`hdfs://localhost:9000/jacksoom/users.parquet`")//直接通過路徑查詢(spark1.6纔可以)

//模式合併
//將兩個表合併,以及合併兩表相應的模式,由於這種操作消耗較大,所以在spark1.5之後的版本默認的將這種功能進行關閉,不過你也可以向下面的例子一樣手動設置爲爲true,或設置全局SQL選項**spark.sql.parquet.mergeSchema爲true。

import sqlContext.implicits._
val df1 = sc.makeRDD(1 to 5).map(i => (i, i * 2)).toDF("single", "double")
df1.write.parquet("data/test_table/key=1")

val df2 = sc.makeRDD(6 to 10).map(i => (i, i * 3)).toDF("single", "triple")
df2.write.parquet("data/test_table/key=2")

//合併這兩個表,首先需要將默認關閉的‘mergeSchema’設置爲true
val df3 = sqlContext.read.option("mergeSchema", "true").parquet("data/test_table")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章