hive -e
“-e”不進入hive的交互窗口執行sql語句,hive -e 後面跟hivesql字符串
bin/hive -e "select id from student;"
hive -f
“-f”執行腳本中sql語句
bin/hive -f /export/servers/datas/hive.sql
知道了語法,我們下面來看在實際工作中是怎麼運用的
一、hive -e 執行hivesql
hive -e 執行的是sql字符串
需求:在shell腳本中定義sql語句,並通過hive -e執行sql內容
我們寫個test_hive_e_2.sh
腳本測試一下,腳本內容如下:
備註:其實我就是想看一下加中文備註,加空格能不能執行
#!/bin/bash
#定義變量
app=gmall
#1、注意定義sql變量的時候等號左右兩邊不能有空格,剛執行這個腳本的時候報錯,就是因爲我變量右邊有空格
#2、看我這個sql分了這麼多行,我主要是想驗證sql分多行是否可執行、加 -- 註釋知否可執行,哈哈,結果就是都可以執行的
#3、這個sql裏面還有個注意點,拼了一個app變量,shell雙引號字符串中拼變量,直接帶上變量名就可以了,
#最好寫成這樣 ${變量名}
sql="
-- 測試
select
mid_id -- 設備唯一標識
,user_id -- 用戶標識
,version_code -- 程序版本號
,version_name -- 程序版本名
,lang -- 系統語言
,source -- 渠道號
,os -- 安卓系統版本
,area -- 區域
,model -- 手機型號
,brand -- 手機品牌
,sdk_version -- sdkVersion
,gmail -- gmail
,height_width -- 屏幕寬高
,app_time -- 客戶端日誌產生時的時間
,network -- 網絡模式
,lng -- 經度
,lat -- 緯度
,entry -- 頁面入口來源
from ${app}.dwd_start_log --啓動日誌表
limit 2;
"
#1、注意呀,hive -e 後面跟sql字符串
hive -e "${sql}"
來看下執行結果
拓展1:shell中定義變量用雙引號和單引號以及不用引號的區別
- 使用單引號的情況下,不管裏面的是否有變量或者其他的表達是都是原樣子輸出
- 雙引號:如果其定義變量的時候使用雙引號的話,則裏面的變量或者函數會通過解析,解析完成後再輸出內容,而不是把雙引號中的變量名以及命令原樣子輸出
- 不使用引號:用於一些簡單字符數字的定義與雙引號類似
- shell變量沒有數據類型的區分
- Shell 把任何存儲在變量中的值,皆視爲以字符組成的“字符串”
- 若變量值中存在空格,必須用雙引號" "把值包括進來
- =號、等號兩邊不能存在空格
二、hive -f 執行hivesql
hive -f 執行的是sql文件
我們先編寫一個sql腳本,然後在執行看下結果
-- 測試
-- 時間:20211226
-- 功能:查詢啓動日誌表數據
-- hive腳本目前不支持多行註釋,Hive腳本的註釋目前好像只有 -- ,註釋會寫成 /**/會報錯
select
mid_id -- 設備唯一標識
,user_id -- 用戶標識
,version_code -- 程序版本號
,version_name -- 程序版本名
,lang -- 系統語言
,source -- 渠道號
,os -- 安卓系統版本
,area -- 區域
,model -- 手機型號
,brand -- 手機品牌
,sdk_version -- sdkVersion
,gmail -- gmail
,height_width -- 屏幕寬高
,app_time -- 客戶端日誌產生時的時間
,network -- 網絡模式
,lng -- 經度
,lat -- 緯度
,entry -- 頁面入口來源
from ${hivevar:database}.dwd_start_log --啓動日誌表
limit 2;
看一下執行結果
hive -hivevar database='gmall' -f dwd_start_log_dql.sql
#如果SQL腳本需要傳遞兩個參數這樣寫
#hive -hivevar enter_school_date="20130902" -hivevar min_ag="26" -f testvar.sql
拓展1: hive SQL 腳本傳參(-hivevar、-hiveconf)