[SDU软件工程实践]Blog3-executeDriver如何处理不同的输入

2021SC@SDUSC

预处理

executeDiver这个方法里,也根据你在启动hive时命令的不同要进行一些不同的处理

-e——直接执行

我们先看看预处理的第一部分
回忆一下execString
execString的来源是这里
process_stage2是之前执行过的
run中调用的process_stage2方法里,我们能看出execString这个属性是来自于我们启动hive时的-e参数的,而-e参数代表的是直接执行指定的HQL语句,看来processLine这个方法很关键。但是这里毕竟还是前期嘛,我们先不着急继续看。

-f——执行文件内容

这里还有一部分,这里的意义属于一看方法名字就知道的
不要着急,这里还没完
我们一看,fileNameprocessFile,明显是跟文件相关嘛。从上面process_stage2里也可以看出fileName来自于-f参数,这代表执行指定文件中的HQL。而这个processFile呢?我们来看一看processFile方法的调用关系。
调用了processReader
processLine?
你会发现兜了一圈又回到processLine上了

处理控制台输入

接下来就是控制台输入的处理了。
我们可以先直接看看最后一段:
虽然很长但是想简单理解就还好吧
我们可以捕捉几个特征:中间有根据“;”进行分割的操作,并将分割下来的字符串交给processLine,这肯定是解析和执行我们输入的HQL命令了。其实呢,到这里差不多了,不过我稍微有研究了一下里面的reader这个对象,发现他是一个叫ConsoleReader的类的对象,它属于jline类库,是java用于处理控制台输入的一个类库。而这一块代码最上面setupConsoleReader这个方法是这个样子的:看见reader了吗
这里就是对reader进行初始化的地方,getCommandCompleter这个含糊返回的东西与什么相关呢?让我们看看这个方法:
这只是一部分
这里干了两件事,第一个是和HIVE FUNCTION有关的,这里做的事情是在设置各种函数,什么函数呢?在HIVE命令行里执行SHOW FUNCTIONS这个函数可以看到>=这样的函数,应该是运算类的函数(忘记截图了……)
我之所以会找到SHOW FUNCTIONS这个函数是因为getFunctionNames有这样的一条调用链:
FunctionRegistry.getFunctionNames=>Registry.getCurrentFunctionNames=>Registry.getFunctionNames
最后我找到了这个:
同源啊
哦?这个函数返回的内容是可以通过SHOW FUNCTIONS调用的啊,我们查查吧……
下面的那个也进行了类似的追索,最后我们看到了这个:
唔……
唔……JOIN、FULL,连FROM、WHERE都出来了,很眼熟啊。
也就是说,reader它是一个加载了各种配置的命令行读取器。最后它读取出来的内容交给processLine处理。

总结

这一段就是对于-e-f和对控制台输入这三种情况进行处理。但是无论是哪一种,经过了各种处理后,它们最后都会将HQL命令交给一个叫processLine的方法进行处理。这就是我们想要找的了。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值