天天看点

hive中的CLI和REPL

搞技术的人可能比较认真。

之前只知道CLI,甚至一度把REPL当成CLI。那下面说说2个东西都是啥。

#######################################################

CLI:

          我猜你肯定知道什么是CLI。英文是:command-line interface

          就是类似于linux命令行界面那种程序。目前主流的标准分POSIX和GNU两种;

          不刀,直接上图说事:

         这种的就叫CLI.你会发现有2种参数设置方式,没错一种是GNU标准(--help),一种是POSIX标准(-h)

REPL:

         我想你肯定也见过REPL,而且你知道什么叫交互环境。那没错,PERL就是交互环境,英文是: read–eval–print- loop 

         没错,想想你在交互环境下面的经历,就是输入(read)->执行(eval)->显示结果(print),然后最外层是个大的循环.

         同样不刀。直接上图说事:

         这种就是典型的REPL.

HIVE:

        如果你用过hive,那你会发现它支持CLI和REPL。

        如hive -e "XXXX";hive -f "XXXX";这种是CLI

           直接输入hive,出来那个有>提示符的界面就是REPL了。

HIVE的提示扩展:

        刀了这么多,只讲点概念,有点对不起观众。

        c/c++领域实现CLI与PERL自然有很成熟的工具包。

        java领域有2个非常著名的包分别来做这2件事:

        CLI:  commons-cli  : http://commons.apache.org/cli/ 

        REPL: jline                : http://jline .sourceforge.net

        java领域实现这种功能基本都是这2个包在做,hive当然也是。这2个包静静的躺在路径的lib下面

        ##########################

        那有什么用呢?这里举个比较有意思的例子。

        如果你常用hive的REPL,那么我想你肯定用过它的自动提示功能,你肯定也想过这个提示的功能太有限,我能定制提示嘛?类似于mysql的rehash功能。这样输入的时候就不用记那么多表名、字段什么的啦啊;

        一个简单而单纯的想法是,我把这些可以提示的词放在一个结构里面,然后我可以CRUD这个结构,这样与提示功能本身分离不是更好;

        你可能有不一样的想法,但我推荐你这么做。一个文件,里面一行放一个你需要提示的词;这样你可能通过外部程序(直接echo也可以啊,噗~)对这个 文件本身进行CRUD;然后hive内部的jline读这个文件,进行提示.很明显的我们通过一个配置文件做到了解耦.

        直接上段代码,你用十分钟学下jline,你就能明白我写的这个是什么意思了:

      没错,我们在用户的根目录下面定义了个.hive-user-keys文件,然后我们可以定期的把需要提示的词整理写入这个文件,然后在PERL中你就能把这些词T出来了。不是很酷嘛?

############

你自己写的一些小程序,通过CLI、JLINE也可以提供非常亲切的用户体验,至少显得你很专业!~