您好,登錄后才能下訂單哦!
hive中怎么設置變量傳遞,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
### org.apache.hadoop.hive.ql.parse.VariableSubstitution:
public String substitute(HiveConf conf, String expr) { if (expr == null) { return expr; } if (HiveConf.getBoolVar(conf, ConfVars.HIVEVARIABLESUBSTITUTE)) { l4j.debug("Substitution is on: " + expr); } else { return expr; } int depth = HiveConf.getIntVar(conf, ConfVars.HIVEVARIABLESUBSTITUTEDEPTH); return substitute(conf, expr, depth); }123456789101112
如果開啟hive.variable.substitute(默認開啟),則使用SystemVariables的substitute方法和hive.variable.substitute.depth(默認為40)進行進一步的判斷:
protected final String substitute(Configuration conf, String expr, int depth) { Matcher match = varPat.matcher(""); String eval = expr; StringBuilder builder = new StringBuilder(); int s = 0; for (; s <= depth; s++) { match.reset(eval); builder.setLength(0); int prev = 0; boolean found = false; while (match.find(prev)) { String group = match.group(); String var = group.substring(2, group.length() - 1); // remove ${ .. } String substitute = getSubstitute(conf, var); if (substitute == null) { substitute = group; // append as-is } else { found = true; } builder.append(eval.substring(prev, match.start())).append(substitute); prev = match.end(); } if (!found) { return eval; } builder.append(eval.substring(prev)); eval = builder.toString(); } if (s > depth) { throw new IllegalStateException( "Variable substitution depth is deeper than " + depth + " for expression " + expr); } return eval; } 12345678910111213141516171819202122232425262728293031323334
如果使用的${}參數超過hive.variable.substitute.depth的數量,則直接拋出異常,所以我們在語句的前面直接加上set hive.variable.substitute.depth=100; 問題解決!
set命令的執行是在CommandProcessor實現類SetProcessor里具體執行,但是substitute語句同時也會在CompileProcessor中調用,也就是在hive語句編譯時就調用了,所以oozie在使用時調用beeline執行語句時,compile階段就報出異常。
但是為什么Hue直接執行這個語句時沒有問題? 因為hue在執行hive時使用的是python開發的beeswax,而beeswax是自己直接處理了這些變量,使用變量實際的值替換變量后再提交給hive執行:
def substitute_variables(input_data, substitutions): """ Replaces variables with values from substitutions. """ def f(value): if not isinstance(value, basestring): return value new_value = Template(value).safe_substitute(substitutions) if new_value != value: LOG.debug("Substituted %s -> %s" % (repr(value), repr(new_value))) return new_value return recursive_walk(f, input_data)
看完上述內容,你們掌握hive中怎么設置變量傳遞的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。