博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hive Server对SQL语句的编译过程 : 前奏
阅读量:6913 次
发布时间:2019-06-27

本文共 2041 字,大约阅读时间需要 6 分钟。

hot3.png

上节说了,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

你可能感兴趣的文章
我的友情链接
查看>>
Hbase的WAL在RegionServer基本调用过程
查看>>
sql语句中left join中的on与where的区别
查看>>
RHEL6.0源码编译安装小企鹅输入法fcitx-4.0.0
查看>>
ModelAndView 跳转的使用
查看>>
JVM系列(一)
查看>>
mybatis中的choose标签的使用
查看>>
mysql数据库与web主机分离实验
查看>>
HTTP Status 400 - Required MultipartFile parameter 'logoFole' is not present
查看>>
Google 宣布将会关闭消费者版本 Google+
查看>>
关于java字符串常用一些api 效率比拼小结(java对大型的字符串api处理效率比拼)...
查看>>
discuzX3* 开启 https 后 UCenter应用通信失败解决
查看>>
CentOS7 中使用 firewall-cmd 控制端口和端口转发
查看>>
如何优化tomcat配置(从内存、并发、缓存4个方面)优化
查看>>
iptables命令
查看>>
Spring支持的CacheManager
查看>>
gulp备忘录
查看>>
PHP句法规则详解
查看>>
h2 数据文件解析
查看>>
DML、DDL、DCL区别
查看>>