用過hive的人都知道,可以通過在cli向hive傳遞引數,變數等,這裡其實是通過下面兩個類實現的。
1
2
org.apache.hadoop.hive.ql.processors.setprocessor類
org.apache.hadoop.hive.ql.parse.variablesubstitution類
其中setprocessor類定義了對set 命令的處理,variablesubstitution類負責把變數值進行轉換。
variablesubstitution用來實現在解析hive命令時把特殊字元進行轉換,如果是以!開頭的shell命令的話,直接在 clidriver類的 processcmd方法中做轉換
1
2
3
else
if
(cmd_trimmed.startswith(
"!"
))
else
if
(expr ==
null
)
matcher match = varpat.matcher(
""
);
string eval = expr;
for
(
int
s=
0
;s
match.reset(eval);
if
(!match.find()) \\$\u0020]+\\}",如果不匹配直接返回
return
eval;
}
string var = match.group();
var = var.substring(
2
, var.length()-
1
);
// remove $
string val = getsubstitute(conf, var);
if
(val ==
null
)
// substitute
eval = eval.substring(
0
, match.start())+val+eval.substring(match.end());
//完成替換
}
throw
new
illegalstateexception(
"variable substitution depth too large: "
+ conf.getintvar(confvars.hivevariablesubstitutedepth) +
" "
+ expr);
}
其中getsubstitute會呼叫setprocessor類,來解析命令。
比如,以hiveconf:開頭的命令會經過如下的處理:
1
2
3
if
(var.startswith( setprocessor.hiveconf_prefix))
但是對於使用命名空間如hiveconf,system,env的,字首則不可少,hivevar可以不需要字首。
1
2
3
4
5
6
7
if
(val ==
null
)
else
}
這裡有個例子:
1
2
set system:testdate=
20140816
;
select * from chinacache_log where dt >=
'$'
limit
5
;
1)第乙個set命令在經過processlocalcmd 方法處理之後,傳入substitute的expr是20140816 (取=號之後的資料)
因為不能匹配到正則,直接回返回。
1
2
3
4
5
string eval = expr;
.....
if
(!match.find())
2)第2條sql
1
select * from ***x where f1>=
'$'
由driver處理後,傳入的expr是
1
select * from peter001 where f1>=
'$'
由match.group()匹配到$,然後通過
1
var.substring(
2
, var.length()-
1
)
去除掉${},並呼叫getsubstitute獲取設定的變數值,並最終生成乙個有效的sql。
最終由1
eval.substring(
0
, match.start())+val+eval.substring(match.end())
返回的值是
1
select * from peter001 where f1>=
'20140816'
hive變數傳遞的原始碼實現
用過hive的人都知道,可以通過在cli向hive傳遞引數,變數等,這裡其實是通過下面兩個類實現的。1 2 org.apache.hadoop.hive.ql.processors.setprocessor類 org.apache.hadoop.hive.ql.parse.variablesubst...
hive的變數傳遞設定
今天同事在oozie的workflow中執行乙個hive查詢,但是直接就報異常 variable substitution depth too large 40,從網上查詢可知,可以確認是由於語句中使用了過多的變數導致,在hive以前的版本中,這個限制是寫死的40個,查詢hive的最新的原 雖然判斷...
原始碼編譯hive
hive hiveconf hive.root.logger debug,console debug模式執行hive 原始碼編譯hive 環境 hadoop 0.20.2 hive 0.6 svn co hive cd hive ant clean package ant package dhado...