Spark Catalyst

解析sql的庫。java

主要類sql

名稱ide

說明函數

CodeGeneratespa

代碼生成器,主要對Expression生成對應的java代碼,輸出ExprCode。裏面包含了一系列的ExprCode子類。繼承

ExprCodeci

生成java代碼,和Expression對應。Expression還有eval方法在InternalRow上判斷條件表達式是否知足。input

Expressionstring

條件表達式,主要的方法是eval和genCode,後者生成對應的ExprCodeit

predicates

條件表達式。

LessThanOrEqual:小於等於;

MoreThan:。。

LessThan等

 

 

 

 

 

    1. predicates

定義了一系列條件表達式,如大於小於,等於,in ()操做等等。每種操做符定義一個單獨的類處理,經過統一的eval()方法返回匹配的結果,是null仍是false仍是true。

例如:

      1. Or

或操做

override def eval(input: InternalRow): Any = {

    val input1 = left.eval(input)

    if (input1 == true) {

      true

    } else {

      val input2 = right.eval(input)

      if (input2 == true) {

        true

      } else {

        if (input1 != null && input2 != null) {

          false

        } else {

          null

        }

      }

    }

  }

leftright只要知足一個就返回true,只要有一個是null則返回null,不然返回false

再看一個And

      1. And

override def eval(input: InternalRow): Any = {

    val input1 = left.eval(input)

    if (input1 == false) {

       false

    } else {

      val input2 = right.eval(input)

      if (input2 == false) {

        false

      } else {

        if (input1 != null && input2 != null) {

          true

        } else {

          null

        }

      }

    }

  }

         left和right只要一個爲false則返回false,若是有null則返回null,不然返回true。

其餘的就不列舉了。

 

 

    1. Expression

Expression:函數表達式,如name(string)這樣的定義格式。

LeafExpression:沒有子節點。child爲nil

UnaryExpression:一個子節點。children只有一個元素[child]

BinaryExpression:兩個子節點

TernaryExpression:三個子節點

TernaryExpression:特殊的BinaryExpression,兩個子節點有相同的輸出數據類型。

每一個列的值先是Expression,而後Seq[Expression]解析成InternalRow

Expression是TreeNode的子類。

大部分的Expression子類應該都是繼承UnaryExpression或者BinaryExpression。

 

      1. NamedExpressions

命名錶達式,判斷select後多個列表達式是否指向同一個,或者對sql語句進行預處理,轉換列表達式。

其中一個重載方式sql,返回處理後的sql語句。

 

      1. UnaryExpression

只有一個child,children也是隻有一個child的列表。

 

override def eval(input: InternalRow): Any = {

    val value = child.eval(input)

    if (value == null) {

      null

    } else {

      nullSafeEval(value)

    }

  }

protected def nullSafeEval(input: Any): Any =

    sys.error(s"UnaryExpressions must override either eval or nullSafeEval")

當子類繼承UnaryExpression時,可能須要重寫eval和nullSafeEval兩個方法。

defineCodeGen方法:返回java source代碼。能夠重寫。

      1. BinaryExpression

繼承Expression,兩個輸入,一個輸出。也是一個基類,不直接使用。

      1. BinaryOperator

繼承BinaryExpression。是一個抽象類,表達式格式:

是相似"x symbol y", 而不是"funcName(x, y)".

主要是一個方法的重寫:

override def sql: String = s"(${left.sql} $sqlOperator ${right.sql})"

輸出sql語句。

相關文章
相關標籤/搜索