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

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

======================================

103201_4WDY_1382024.png

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

ParseDriver pd = new ParseDriver();

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

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

解析的代码如下:

 

public ASTNode parse(String command, Context ctxthrows ParseException {

// 看到这里了

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

// 看到这里了

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的专业知识,凭我目前的功力无法破解!!!直接给出解析后的树

131213_nSmU_1382024.png

 

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

132942_o22W_1382024.png

 

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

133421_Rn9E_1382024.png

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

进入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而起,这个参数干嘛的呢?

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

 

 

 

 

 

转载于:https://my.oschina.net/qiangzigege/blog/638971

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值