背景:
根據《Hive權威指南》上講,在hive-0.8.0以后可以使用--define key=value命令定義用戶自定義的變量以便在Hive腳本中引用。當用戶使用這個功能時,Hive會將這個鍵值對放在hivevar命名空間下。並且,hivevar這個命名空間在使用過程中是可選的,也就是說可寫可不寫,自定義的變量都會放在hivevar這個命名空間下。
為了支持上面的觀點,書上做了下面的操作。我為了親自體會,使用的是hive-0.13.0。
1.使用hive --define foo=bar語句,在hive中定義一個變量名為foo,值為bar;
效果圖如下:
2.使用set foo;查看變量foo的值,從效果圖可以看出,foo的值確實為bar。
效果圖如下:
3.再使用set hivevar:foo;查看hivevar命名空間下的變量foo的值,從效果圖可以看出,hivevar命名空間下的變量foo的值確實為bar。測試到這里,已經可以給人感覺加不加hivevar:這個命名空間名結果都是一樣的。
效果圖如下:
4.書中為了更確定的證明結論的正確性,又使用set hivavar:foo=bar2;改變foo的值,並使用set fool;和set hivevar:foo;查看不帶命名空間和帶命名空間的foo的值是否都已經改變。根據效果圖可以看出,兩個foo確實已經改變,證畢。於是書中給了開篇所說的結論。
效果圖如下:
5.注意:下面我們來分析一下,既然hivevar:命名空間是可選的,那么我們使用set foo=bar3;再次改變foo的值,帶命名空間和不帶命名空間的foo的值都應該變成bar3,下面我們做此測試,根據效果圖可以看到,結果並不如我們推測的那樣,而是不帶命名空間的foo值變成了bar3,帶命名空間的foo的值竟然沒有變化!
效果圖如下:
結論:
“在hive中使用set操作自定義變量時,hivevar:命名空間不是可選的,應該是在使用set定義變量時時刻加hivevar:命名空間,以免出現難以找出的錯誤。”
附加:
“因為--define key=value實際上與--hivevar key=value是等價的,所以無論你習慣使用上面哪個操作自定義變量,都要加命名空間,不然都存在以上說的問題”