Hive命令
目錄
如何在hive cli中執行shell命令或訪問hdfs呢?
前言
Hive是有命令行模式的,你知道嗎?很實用,很適合用來學習一些語法呀,簡單的操作鴨...不用煩瑣的去寫代碼、打包、上傳、運行、就可以實現的哦~
$HIVE_HOME/bin/hive這個shell命令(後面我們省略稱爲hive)是通向包括命令行界面也就是CLI等Hive服務的通道。我們假定用戶已經將$HIVE_HOME/bin加入到環境變量PATH中了,則用戶只需要在shell提示符中輸入hive,就可以使用戶的shell環境(例如bash環境)找到這個命令。切記啓動hive的話,需要啓用hadoop哦,如果只是簡單操作不涉及統計類的操作,不會啓用MapReduce任務,也可以不啓動yarn哦~
start-dfs.sh
jps
hive --help
需要注意ServiceList後面的內容。這裏提供了幾個服務,包括我們絕大多數時間將要使用的CLI。用戶可以通過servicename服務名稱來啓用某個服務,儘管其中有幾個服務也是有快捷啓動方式的。
下面看下hive自帶的各個服務及應用說明,有幾個我也沒用過,後續用了再補充哈~
Hive服務 | ||
選項 | 名稱 | 描述 |
beeline | 新一代hive客戶端(相對於hive命令,遠程客戶端,可以配置用戶名/密碼/ip服務器等) | |
hiveserver2 | Hive Server2 | 監聽來自其他進程的Thrift連接的一個守護進程 |
metastore | 啓動一個擴展的Hive元數據服務,可以供多個客戶端使用 | |
cleardanglingscratchdir | hive異常結束時,可能有一些臨時目錄未清理,執行此命令清理 | |
cli | 命令行界面 | 用戶定義表,執行查詢等。如果沒有指定其他服務,這個是默認的服務 |
hbaseimport | 沒用過,不太清楚 | |
hbaseschematool | 沒用過,不太清楚 | |
help | 查看幫助手冊 | |
hiveburninclient | 執行幾條測試語句,貌似沒啥用 | |
hplsql | plsql支持 | |
hwi | Hive Web界面 | 是一個可以執行查詢命令和其他命令的簡單的Web界面,這樣可以不用登錄到集羣中的某臺機器上使用Cli來進行查詢 |
jar | hadoop jar 命令的一個擴展,這樣可以執行需要Hive環境的應用 | |
lineage | 查看血緣關係 | |
llap | 啓動llap | |
llapdump | 沒用過,不太清楚 | |
llapstatus | 沒用過,不太清楚 | |
metatool | metastore元數據管理 | |
orcfiledump | 查看orc文件,同下 | |
rcfilecat | 一個可以打印出RCFile格式文件內容的工具 | |
schemaTool | metastore數據庫schema管理 | |
version | 查看Hive的版本信息 |
查看某個服務的幫助手冊方式:hive --help --service cli (cli替換成別的服務即可查詢啦)
變量和屬性
--definekey=value實際上和hivevarkey=value是等價的。二者都可以讓用戶在命令行定義用戶自定義變量以便在Hive腳本中引用,來滿足不同情況的執行。這個功能只有Hivev0.8.0版本和之後的版本才支持。
當用戶使用這個功能時,Hive會將這些鍵值對放到hivevar命名空間,這樣可以和其他3種內置命名空間(也就是hiveconf、system和env),進行區分。
變量或者屬性是在不同的上下文中使用的術語,但是在大多數情況下它們的功能是相同的。
下表描述了命名空間選項:
Hive中變量和屬性命名空間 | ||
命名空間 | 使用權限 | 描述 |
hivevar | 可讀寫 | 用戶自定義變量 |
hiveconf | 可讀寫 | hive相關的配置屬性 |
system | 可讀寫 | java定義的配置屬性 |
env | 只讀 | Shell環境定義的環境變量 |
Hive變量內部是以Java字符串的方式存儲的。用戶可以在查詢中引用變量。Hive會先使用變量值替換掉查詢的變量引用,然後纔會將查詢語句提交給查詢處理器。
在CLI中,可以使用SET命令顯示或者修改變量值。例如,下面這個會話先顯示一個變量的值,然後再顯示env命名空間中定義的所有變量!爲了更清晰地表現,我們省略掉了這個Hive會話中的一些輸出信息,而且在每行命令之間人爲地增加了一個空白行:
set ;
set -v ;
如果不加v標記,set命令會打印出命名空間hivevar,hiveconf,system和env中所有的變量。使用v標記,則還會打印Hadoop中所定義的所有屬性,例如控制HDFS和MapReduce的屬性。
set命令還可用於給變量賦新的值。我們特別看下hivevar命名空間以及如何通過命令行定義一個變量:
我們可以看到,前綴hivevar:是可選的。
hivevar標記和define標記是相同的。在CLI中查詢語句中的變量引用會先被替換掉然後纔會提交給查詢處理器。思考如下這個CLI會話(在v0.8.*版本中使用): (變量在cli中的使用)
我們來看看hiveconf選項,Hivev0.7.*版本支持這個功能,其用於配置Hive行爲的所有屬性。我們用它來指定Hivev0.8.0版本中增加的hive.cli.print.current.db屬性。開啓這個屬性可以在CLI提示符前打印出當前所在的數據庫名(第4.1節“Hive中的數據庫”中有關於Hive數據庫的更多信息),默認的數據庫名爲default。這個屬性的默認值是false。
我們甚至可以增加新的hiveconf屬性,這個功能只有Hivev0.8.0版本前的版本才支持:
我們還有必要了解一下system命名空間,Java系統屬性對這個命名空間內容具有可讀可寫權利;而env命名空間,對於環境變量只提供可讀權限:
和hivevar變量不同,用戶必須使用system:或者env:前綴來指定系統屬性和環境變量。env命名空間可作爲向Hive傳遞變量的一個可選的方式,特別是對於Hivev0.7.*版本。考慮如下這個例子:
Hive中所有的內置屬性都在$HIVE_HOME/conf/hive-default.xml.template中列舉出來了,這是個“樣例”配置文件。配置文件中還說明了這些屬性的默認值。
Hive中“一次使用”命令
用戶可能有時期望執行一個或者多個查詢(使用分號分隔),執行結束後hiveCLI立即退出。Hive提供了這樣的功能,因爲CLI可以接受e命令這種形式。如果表mytable具有一個字符串字段和一個整型字段,我們可以看到如下輸出:
首先造一些測試數據:
hive -e "執行sql";
hive -e "select * from stu limit 2";
臨時應急時可以使用這個功能將查詢結果保存到一個文件中。增加S選項可以開啓靜默模式,這樣可以在輸出結果中去掉“OK”和“Timetaken”等行,以及其他一些無關緊要的輸出信息,如下面這個例子:
hive -S -e "select * from stu limit 2" > /tmp/student.txt
cat /tmp/student.txt
需要注意的是,Hive會將輸出寫到標準輸出中。上面例子中的shell命令將輸出重定向到本地文件系統中,而不是HDFS中。
最後,當用戶不能完整記清楚某個屬性名時,可以使用下面這個非常有用的技巧來模糊獲取這個屬性名而無需滾動set命令的輸出結果進行查找。假設用戶沒記清哪個屬性指定了管理表的“warehouse(數據倉庫)”的路徑,通過如下命令可以查看到:
執行文件中的SQL
- hive -f 'xxx.sql'
- source 'xxx.sql'
執行文件中的sql有兩種寫法如上,hive -f 和 hive -e 類似,在命令行或者shell中執行即可,source需要登錄進入hive cli客戶端以後纔可以,並且儘可能的要輸入sql文件的全路徑,如下:
如何在hive cli中執行shell命令或訪問hdfs呢?
- 執行shell:! + ‘shell命令’ + ‘;’
- 執行hdfs:dfs + ‘命令’ + ‘;’
hiverc文件
我們最後將要討論的CLI選項是 -i 文件名(初始化sql文件內容,類似於帶參啓動hive cli一樣)。這個選項允許用戶指定一個文件,當CLI啓動時,在提示符出現前會先執行這個文件。Hive會自動在HOME目錄下尋找名爲.hiverc的文件,而且會自動執行這個文件中的命令(如果文件中有的話)。
hive cli 小技巧
自動補全命令
如果用戶在輸入的過程中敲擊Tab製表鍵,那麼CLI會自動補全可能的關鍵字或者函數名。例如,如果用戶輸入SELE然後按Tab鍵,CLI將自動補全這個詞爲SELECT。
查看執行命令歷史
用戶可以使用上下箭頭來滾動查看之前的命令。事實上,每一行之前的輸入都是單獨顯示的,CLI不會把多行命令和查詢作爲一個單獨的歷史條目。Hive會將最近的100,00行命令記錄到文件$HOME/.hivehistory中。
如果用戶想再次執行之前執行過的某條命令,只需要將光標滾動到那條記錄然後按Enter鍵就可以了。如果用戶需要修改這行記錄後再執行,那麼需要使用左右方向鍵將光標移動到需要修改的地方然後重新編輯修改就可以了。修改後用戶直接敲擊Enter鍵就可以提交這條命令而無需切換到命令尾。
大多數的導航按鍵使用的Contrl+字母的命令和bashshell中是相同的(例如,Control+A代表光標移到到行首,Control+B代表光標移動到行尾)。然而,類似的“元操作”Option或者Escape鍵就不起作用了(例如,Option+F一次向前移動一個單詞這樣的命令)。相似地,Delete刪除鍵會刪除光標左邊的字符,而ForwardDelete回格鍵不會刪除掉光標當前所在的字符。
如何註釋SQL?
hive的註釋和sql註釋是一樣的~ 你學會了嗎?