hive變數傳遞的原始碼實現

2021-06-25 08:46:35 字數 3806 閱讀 6891

用過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

elseif(cmd_trimmed.startswith("!"))else

if(expr ==null)

matcher match = varpat.matcher("");

string eval = expr;

for(ints=0;smatch.reset(eval);

if(!match.find()) \\$\u0020]+\\}",如果不匹配直接返回

returneval;

}

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());//完成替換

}

thrownewillegalstateexception("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 >='$'limit5;

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...