數(shù)倉--Hive-面試之向Hive中傳入變量的方式

Hive向程序中傳遞變量的方式

  • 暴力替換
    • 字符串替換
    • 正則替換
    • 模板引擎
  • 系統(tǒng)環(huán)境變量
    • shell環(huán)境變量:${env:varname}
    • system系統(tǒng)變量:${system:varname}
  • hive 命令參數(shù)
    • hivevar方式:${hivevar:varname}
    • hiveconf方式:${hiveconf:varname}

hive接收外部變量方式詳解

  • 使用Hive編寫程序最常用的方法是將Hive語句寫到文件中,然后使用hive -f filename.hql來批量執(zhí)行查詢語句。經(jīng)常需要將外部參數(shù)傳入到hql語句中替換其中的變量來動態(tài)執(zhí)行任務,比如動態(tài)設定數(shù)據(jù)庫名、表名、時間值、字段序列等變量,以達到腳本泛化執(zhí)行的目的。
  • 在使用hive開發(fā)數(shù)據(jù)分析代碼時,經(jīng)常會遇到需要改變運行參數(shù)的情況,比如select語句中對日期字段值的設定,可能不同時間想要看不同日期的數(shù)據(jù),這就需要能動態(tài)改變日期的值。如果開發(fā)量較大、參數(shù)多的話,使用變量來替代原來的字面值非常有必要,對傳入的方式進行總結。

數(shù)據(jù)準備

  • hive 表中創(chuàng)建數(shù)據(jù)
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;
  • 測試數(shù)據(jù)
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的開發(fā)模式非常常見,在shell中直接定義變量,在hive -e語句中就可以直接引用;

注意

  • 注意:使用 hiveconf 定義,在hive -e中是不能使用的
  • 修改一下剛才的shell文件,采用-hiveconf的方法定義日期參數(shù):
#!/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環(huán)境中運行的,于是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;

總結

  • 三種方式,各有優(yōu)劣,可以按照代碼特點進行選擇;
  • 但是再面試的過程中,都要進行準確的說出。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容