Hive Server对SQL语句的编译过程 : 前奏

上节说了,server接收到一个sql命令后,会编译此命令。sql

======================================函数

重点就在此了,继续往下看spa

ParseDriver pd = new ParseDriver();server

ASTNode tree = pd.parse(commandctx);---看来是要解析成一个树!token

===看看是如何解析成树的!ip

解析的代码以下:get

 

public ASTNode parse(String command, Context ctxthrows ParseException {源码

// 看到这里了it

LOG.info("Parsing command: " + command);io

// 看到这里了

HiveLexerX lexer = new HiveLexerX(new ANTLRNoCaseStringStream(command));

TokenRewriteStream tokens = new TokenRewriteStream(lexer);

if (ctx != null) {

ctx.setTokenRewriteStream(tokens);

}

HiveParserX parser = new HiveParserX(tokens);

parser.setTreeAdaptor(adaptor);

HiveParser.statement_return r = null;

try {

r = parser.statement();

catch (RecognitionException e) {

throw new ParseException(parser.getErrors());

}

 

if (lexer.getErrors().size() == 0 && parser.getErrors().size() == 0) {

LOG.info("Parse Completed");

else if (lexer.getErrors().size() != 0) {

throw new ParseException(lexer.getErrors());

else {

throw new ParseException(parser.getErrors());

}

 

return (ASTNode) r.getTree();

}

那么究竟是个啥意思呢?

这下面都是编译原理antlr的专业知识,凭我目前的功力没法破解!!!直接给出解析后的树

 

看来解析却是成功了!而后后面的解析过程仍是挺麻烦的,都看晕了,直接给出结果吧

 

 看来就是这种任务在执行了!!!而后跑去看DDLTask的源码,发现有这么一个函数

看来这一步走对了!   进入这个函数执行!

进入createDatabase函数执行!!!源码以下:

  private int createDatabase(Hive db, CreateDatabaseDesc crtDb)

      throws HiveException, AlreadyExistsException {

    Database database = new Database();

    database.setName(crtDb.getName());

    database.setDescription(crtDb.getComment());

    database.setLocationUri(crtDb.getLocationUri());

    database.setParameters(crtDb.getDatabaseProperties());

 

    db.createDatabase(databasecrtDb.getIfNotExists());

    return 0;

  }

===核心语句在 db.createDatabase(databasecrtDb.getIfNotExists());源码以下:

 

public void createDatabase(Database dbboolean ifNotExistthrows AlreadyExistsException, HiveException {

try {

getMSC().createDatabase(db);

catch (AlreadyExistsException e) {

if (!ifNotExist) {

throw e;

}

catch (Exception e) {

throw new HiveException(e);

}

}

中间报了一次错误:由于hive.metastore.uris而起,这个参数干吗的呢?

这个问题放在下一节描述!

相关文章
相关标签/搜索