sparkSQL之DataFrame創建

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()
  }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章