天天看點

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也可以提供非常親切的使用者體驗,至少顯得你很專業!~

繼續閱讀