前面章节讲解了Spark-SQL中的核心流程,接下来主要讲解如何将sql语句转化为UnResolved Logical Plan(包含UnresolvedRelation、 UnresolvedFunction、 UnresolvedAttribute)。
protected[sql] def parseSql(sql: String): LogicalPlan = {
val ret = ddlParser.parse(sql, false)
ret
}
private[sql] class DDLParser(
parseQuery: String => LogicalPlan)
extends AbstractSparkSQLParser with DataTypeParser with Logging {
def parse(input: String, exceptionOnError: Boolean): LogicalPlan = {
try {
//先解析看看是不是DDL语句
parse(input)
} catch {
case ddlException: DDLException => throw ddlException
case _ if !exceptionOnError => parseQuery(input)//进一步解析其它类型的语句,其parseQuery为DDLParser的构造参数
case x: Throwable => throw x
}
}
}
protected[sql] val ddlParser = new DDLParser(sqlParser.parse(_))
//其中fallback= getSQLDialect().parse(_)
protected[sql] val sqlParser = new SparkSQLParser(getSQLDialect().parse(_