博主按:近一段時間,一直在研究Hadoop及其上的應用技術,因爲之前一直做關係數據庫系統的開發與維護,在衆多基於Hadoop的技術中,Hive與Hbase的使用方法一直是自己關注的重點。爲了對Hive技術有一個準確的認識,開始着手研究Hive的官方技術文檔。在閱讀的時候順手按照自己的理解翻譯出來,寫在博客上,權當然閱讀本記,純屬自娛自樂,如果能給瀏覽的諸君帶來些許的參考,那真是不勝榮幸之至。而理解與翻譯不確切的地方,還請大家海涵。
一、介紹
在Hive交互Shell模式下。通過使用Hive變量替換,可以減少重複輸入那些可用於Hive命令的被插入到腳本語言中的一些代碼。例如:
$ a=b
$ hive -e " describe $a "
儘管Hive與腳本語言的緊密結合讓使用者感覺複雜,但是當執行比較複雜的類似Hive –e批處理命令時,可以有效減少Hive啓動時間的佔比。Hive 變量跟Set配合使用,實現強大的替換能力,例如執行如下命令:
$ bin/hive --hiveconf a=b -e 'set a; sethiveconf:a;create table if not exists b (col int); describe ${hiveconf:a}'
命令可以分解爲以下步驟:
-
--hiveconf a=b 設置在Hive命令中使用變量替換:a=b
-
Set a; 定義在Hive CLI中的hiveconf變量a
-
create table… 創建一個名稱爲b的Hive數據表
-
describe ${hiveconf:a} 使用變量替換,通過a引用b的值,顯示b的表結構
上面命令的執行結果爲:
Hive historyfile=/tmp/edward/hive_job_log_edward_201011240906_1463048967.txt
a=b
hiveconf:a=b
OK
Time taken: 5.913 seconds
OK
col int
Time taken: 0.754 seconds
hiveconf選項從Hive0.7.0開始加入進來,在Hive0.8.0增加了define和hivevar選項,在Hive0.9.0中三者的含義沒有發生變化,在此不做贅述。
二、使用變量
變量分屬於三個命名空間:hiveconf, system, and env,或者說變量根據所屬的命名空間分爲三種類型。創建與使用變量替換可以通過Hive -e命令實現,也可以在Hive CLI中實現,創建與引用的hiveconf變量的方法如下:
set x=myvalue --創建hiveconf變量,並賦值myvalue,myvalue可能是常量也可能是一個變量
${hiveconf:x} --引用hiveconf變量x
下面是一些使用變量替換的示例,它們必須在Hive CLI中執行(來自腳本:ql/src/test/queries/clientpositive/set_processor_namespaces.q):
set zzz=5; --定義hiveconf變量zzz並且賦初值5
set zzz; --輸出zzz的值
set system:xxx=5; --定義system變量xxx並賦初值5
set system:xxx; --輸出xxx的值
set system:yyy=${system:xxx}; --定義system變量yyy,並把xxx的值賦作初值
set system:yyy; --輸出yyy的值
set go=${hiveconf:zzz}; --定義hiveconf變量go,並且把同類型的變量zzz的值賦作初值
set go; --輸出go的值
set hive.variable.substitute=false; --禁用Hive的變量替換功能
set raw=${hiveconf:zzz}; --定義hiveconf變量raw,並且把同類型的變量zzz的值賦作初值
set raw; --輸出raw的值,會發現zzz的值根本無法賦給raw
set hive.variable.substitute=true; --啓用Hive的變量替換功能
EXPLAIN SELECT * FROM src wherekey=${hiveconf:zzz}; --hiveconf變量zzz用在查詢語句中
SELECT * FROM src wherekey=${hiveconf:zzz};
set a=1;
set b=a;
set c=${hiveconf:${hiveconf:b}}; --變量替換的嵌套使用
set c;
set jar=../lib/derby.jar;
add file ${hiveconf:jar}; --使用變量替換添加資源文件
list file;
delete file ${hiveconf:jar}; --使用變量替換刪除資源文件
list file;
三、變量替換的禁用與啓用
默認情況下,Hive的變量替換是啓用的,如果要禁用變量替換,在Hive的CLI下,輸入如下命令:
set hive.variable.substitute=false;
如果想重新啓用變量替換,則輸入如下命令:
sethive.variable.substitute=true;