1、 SparkSession
是SQLContext和HiveContext的組合; 爲了向後兼容,所以在SQLContext和HiveContext上可用的API在SparkSession上同樣是可以使用的。
SparkSession內部封裝了sparkContext、SparkConf、SQLContext,所以計算實際上是由sparkContext完成的。
---- 爲用戶提供一個統一的切入點使用Spark 各項功能
---- 允許用戶通過它調用 DataFrame 和 Dataset 相關 API 來編寫程序
--- 與 Spark 交互之時不需要顯示的創建 SparkConf, SparkContext 以及 SQlContext,這些對象已經封閉在 SparkSession 中
2、創建DataFrame的方式
方式一:sparkSQL之數據源讀取parquet、json、csv案例。
方式二:通過 structType 創建 DataFrames(編程接口)。createDataFrame的方法創建
import org.apache.spark.SparkConf
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.types.{IntegerType, StringType, StructField, StructType}
import org.apache.spark.sql.{DataFrame, SparkSession}
object TestSparkSql {
def main(args: Array[String]): Unit = {
val conf: SparkConf = new SparkConf().setAppName("SparkSql").setMaster("local[*]")
val sc: SparkSession = SparkSession.builder().config(conf).enableHiveSupport().getOrCreate()
// 將本地的數據讀入 RDD
val peopleRdd = sc.sparkContext.textFile("file:\\F:\\Input")
// 將 RDD 數據映射成 Row,需要 import org.apache.spark.sql.Row
import org.apache.spark.sql.Row
val rowRDD: RDD[Row] = peopleRdd.map(line => {
val fields = line.split(",")
Row(fields(0), fields(1).trim.toInt)
})
val structType: StructType = StructType(
//字段名,字段類型,是否可以爲空
StructField("name", StringType, true) ::
StructField("age", IntegerType, true) :: Nil
)
//將DataFrames創建成一個臨時的視圖
val df: DataFrame = sc.createDataFrame(rowRDD,structType)
df.createTempView("people")
sc.sql("select * from people").show() //使用SQL語句進行查詢
sc.stop()
}
}
方式三:通過 case class 創建 DataFrames(反射)。通過 case classRDD轉化成DataFrame
import org.apache.spark.SparkConf
import org.apache.spark.sql.{DataFrame, SparkSession}
//定義case class,相當於表結構
case class People(var name: String, var age: Int)
object TestSparkSql {
def main(args: Array[String]): Unit = {
val conf: SparkConf = new SparkConf().setAppName("SparkSql").setMaster("local[*]")
val sc: SparkSession = SparkSession.builder().config(conf).enableHiveSupport().getOrCreate()
// 將本地的數據讀入 RDD, 並將 RDD 與 case class 關聯
val peopleRdd = sc.sparkContext.textFile("file:\\F:\\Input\\people.txt")
.map(line => People(line.split(",")(0),line.split(",")(1).trim.toInt))
import sc.implicits._
// 將RDD 轉換成 DataFrames
val df: DataFrame = peopleRdd.toDF
//將DataFrames創建成一個臨時的視圖
df.createOrReplaceTempView("people")
sc.sql("select * from people").show() //使用SQL語句進行查詢
sc.stop()
}
}