1. 程式人生 > 實用技巧 >Visualizing the stock market structure of sklearn

Visualizing the stock market structure of sklearn

SparkSQL

發展過程

解決的問題

  • Spark SQL 使用 Hive 解析 SQL 生成 AST 語法樹, 將其後的邏輯計劃生成, 優化, 物理計劃都自己完成, 而不依賴 Hive

  • 執行計劃和優化交給優化器 Catalyst

  • 內建了一套簡單的 SQL 解析器, 可以不使用 HQL, 此外, 還引入和 DataFrame 這樣的 DSL API, 完全可以不依賴任何 Hive 的元件

  • Shark 只能查詢檔案, Spark SQL 可以直接降查詢作用於 RDD, 這一點是一個大進步

適用場景

 定義特點舉例

結構化資料

有固定的 Schema

有預定義的 Schema

關係型資料庫的表

半結構化資料

沒有固定的 Schema, 但是有結構

沒有固定的 Schema, 有結構資訊, 資料一般是自描述的

指一些有結構的檔案格式, 例如 JSON

非結構化資料

沒有固定 Schema, 也沒有結構

沒有固定 Schema, 也沒有結構

指文件圖片之類的格式

  • SparkRDD 主要用於處理 非結構化資料半結構化資料

  • SparkSQL 主要用於處理 結構化資料

SparkSession

SparkContext在讀取檔案的時候,讀取出來的是 RDD, 不包含 Schema(結構化)資訊。所以出現了SparkSession作為SparkSQL的入口點,包括了 SQLContext

, HiveContext, SparkContext 等元件的功能

val spark: SparkSession = new sql.SparkSession.Builder()
  .appName("hello")
  .master("local[6]")
  .getOrCreate()

Catalyst優化器

SparkSQL 大部分情況用於處理結構化資料和半結構化資料, 所以 SparkSQL 可以獲知資料的 Schema, 從而根據其 Schema 來進行優化

SparkSQL整體架構

  1. API 層簡單的說就是 Spark 會通過一些 API 接受 SQL 語句

  2. 收到 SQL

    語句以後, 將其交給 Catalyst, Catalyst 負責解析 SQL, 生成執行計劃等

  3. Catalyst 的輸出應該是 RDD 的執行計劃

  4. 最終交由叢集執行

簡單優化過程

Catalyst 的主要運作原理是分為三步, 先對 SQL 或者 Dataset 的程式碼解析, 生成邏輯計劃, 後對邏輯計劃進行優化, 再生成物理計劃, 最後生成程式碼到叢集中以 RDD 的形式執行

Dataset

  1. Dataset 是一個新的 Spark 元件, 其底層還是 RDD

  2. Dataset 提供了訪問物件中某個特定欄位的能力, 不用像 RDD 一樣每次都要針對整個物件做操作

  3. DatasetRDD 不同, 如果想把 Dataset[T] 轉為 RDD[T], 則需要對 Dataset 底層的 InternalRow 做轉換, 是一個比價重量級的操作

 

DataFrame

  1. DataFrame 是一個類似於關係型資料庫表的函式式元件

  2. DataFrame 一般處理結構化資料和半結構化資料

  3. DataFrame 具有資料物件的 Schema 資訊

  4. 可以使用命令式的 API 操作 DataFrame, 同時也可以使用 SQL 操作 DataFrame

  5. DataFrame 可以由一個已經存在的集合直接建立, 也可以讀取外部的資料來源來建立

Dataset 和 DataFrame 的異同

  1. DataFrame 是 Dataset 的一種特殊情況, 也就是說 DataFrame 是 Dataset[Row] 的別名。
  2. DataFrame 和 Dataset 所表達的語義不同
  • DataFrame 表達的含義是一個支援函式式操作的 , 而 Dataset 表達是是一個類似 RDD 的東西, Dataset 可以處理任何物件
  • DataFrame 中所存放的是 Row 物件, 而 Dataset 中可以存放任何型別的物件
  • DataFrame 的操作方式和 Dataset 是一樣的, 但是對於強型別操作而言, 它們處理的型別不同
  • DataFrame 只能做到執行時型別檢查, Dataset 能做到編譯和執行時都有型別檢查

程式碼解析:

def dataframe4(): Unit = {
    val spark = SparkSession.builder()
      .appName("dataframe1")
      .master("local[6]")
      .getOrCreate()

    import spark.implicits._

    val personList = Seq(Person("zhangsan", 15), Person("lisi", 20))

    // DataFrame 是弱型別的
    val df: DataFrame = personList.toDF()
    df.map( (row: Row) => Row(row.get(0), row.getAs[Int](1) * 2) )(RowEncoder.apply(df.schema))
      .show()

    // DataFrame 所代表的弱型別操作是編譯時不安全
//    df.groupBy("name, school")

    // Dataset 是強型別的
    val ds: Dataset[Person] = personList.toDS()
    ds.map( (person: Person) => Person(person.name, person.age * 2) )
      .show()

    // Dataset 所代表的操作, 是型別安全的, 編譯時安全的
//    ds.filter( person => person.school )
  }