2021SC@SDUSC
预处理
在executeDiver
这个方法里,也根据你在启动hive时命令的不同要进行一些不同的处理
-e
——直接执行
我们先看看预处理的第一部分
execString的来源是这里
在run
中调用的process_stage2
方法里,我们能看出execString
这个属性是来自于我们启动hive
时的-e
参数的,而-e
参数代表的是直接执行指定的HQL语句,看来processLine
这个方法很关键。但是这里毕竟还是前期嘛,我们先不着急继续看。
-f
——执行文件内容
这里还有一部分,这里的意义属于一看方法名字就知道的
我们一看,fileName
、processFile
,明显是跟文件相关嘛。从上面process_stage2
里也可以看出fileName
来自于-f
参数,这代表执行指定文件中的HQL。而这个processFile
呢?我们来看一看processFile
方法的调用关系。
你会发现兜了一圈又回到processLine
上了
处理控制台输入
接下来就是控制台输入的处理了。
我们可以先直接看看最后一段:
我们可以捕捉几个特征:中间有根据“;”进行分割的操作,并将分割下来的字符串交给processLine
,这肯定是解析和执行我们输入的HQL命令了。其实呢,到这里差不多了,不过我稍微有研究了一下里面的reader
这个对象,发现他是一个叫ConsoleReader
的类的对象,它属于jline
类库,是java用于处理控制台输入的一个类库。而这一块代码最上面setupConsoleReader
这个方法是这个样子的:
这里就是对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
的方法进行处理。这就是我们想要找的了。