Hive向程序中傳遞變量的方式
- 暴力替換
- 字符串替換
- 正則替換
- 模板引擎
- 系統環境變量
- shell環境變量:${env:varname}
- system系統變量:${system:varname}
- hive 命令參數
- hivevar方式:${hivevar:varname}
- hiveconf方式:${hiveconf:varname}
hive接收外部變量方式詳解
- 使用Hive編寫程序最常用的方法是將Hive語句寫到文件中,然后使用hive -f filename.hql來批量執行查詢語句。經常需要將外部參數傳入到hql語句中替換其中的變量來動態執行任務,比如動態設定數據庫名、表名、時間值、字段序列等變量,以達到腳本泛化執行的目的。
- 在使用hive開發數據分析代碼時,經常會遇到需要改變運行參數的情況,比如select語句中對日期字段值的設定,可能不同時間想要看不同日期的數據,這就需要能動態改變日期的值。如果開發量較大、參數多的話,使用變量來替代原來的字面值非常有必要,對傳入的方式進行總結。
數據准備
- hive 表中創建數據
use test; ---學生信息表 create table IF NOT EXISTS student( sno bigint comment '學號' , sname string comment '姓名' , sage bigint comment '年齡' , pdate string comment '入學日期' ) COMMENT '學生信息表' ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' STORED AS TEXTFILE; LOAD DATA LOCAL INPATH '/home/users/root/testdata_student' INTO TABLE student;
- 測試數據
1 name1 21 20130901 2 name2 22 20130901 3 name3 23 20130901 4 name4 24 20130901 5 name5 25 20130902 6 name6 26 20130902 7 name7 27 20130902 8 name8 28 20130902 9 name9 29 20130903 10 name10 30 20130903 11 name11 31 20130903 12 name12 32 20130904 13 name13 33 20130904
1-shell中設置變量,hive -e中直接使用
- 測試腳本
#!/bin/bash
tablename="student"
limitcount="8"
hive -S -e "use test; select * from ${tablename} limit ${limitcount};"
- 可以正常運行
- 由於hive自身是類SQL語言,缺乏shell的靈活性和對過程的控制能力,所以采用shell+hive的開發模式非常常見,在shell中直接定義變量,在hive -e語句中就可以直接引用;
注意
- 注意:使用 hiveconf 定義,在hive -e中是不能使用的
- 修改一下剛才的shell文件,采用-hiveconf的方法定義日期參數:
#!/bin/bash
tablename="student"
limitcount="8"
hive -S \
-hiveconf enter_school_date="20130902" \
-hiveconf min_age="26" \
-e \
" use test; \
select * from ${tablename} \
where \
pdate='${hiveconf:enter_school_date}' \
and \
sage>'${hiveconf:min_age}' \
limit ${limitcount};"
- 運行會失敗,因為該腳本在shell環境中運行的,於是shell試圖去解析{hiveconf:enter_school_date}和${hiveconf:min_age}變量,但是這兩個SHELL變量並沒有定義,所以會以空字符串放在這個位置。
方法2:使用-hiveconf定義,在SQL文件中使用
- 因為換行什么的很不方便,hive -e只適合寫少量的SQL代碼,所以一般都會寫很多hql文件,然后使用hive –f 的方法來調用,這時候可以通過-hiveconf定義一些變量,然后在SQL中直接使用。
- 先編寫shell文件
#!/bin/bash
hive -hiveconf enter_school_date="20130902" -hiveconf min_ag="26" -f testvar.sql
- 被調用腳本
use test; select * from student where pdate='${hiveconf:enter_school_date}' and sage > '${hiveconf:min_ag}' limit 8;
方法3:使用hivevar,再sql文件中使用
- 再hql腳本中寫使用set hivevar:varname的方式
- 定義腳本
#!/bin/bash
hive -f testvar.sql
- sql腳本
use test; set hivevar:center_school_date="20130920"; set hivevar:min_age="26"; select * from student where pdate='${hivevar:enter_school_date}' and sage > '${hivevar:min_ag}' limit 8;
