hive中怎么设置变量传递

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中怎么设置变量传递的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联行业资讯频道,感谢各位的阅读!


文章标题:hive中怎么设置变量传递
标题网址:http://hbruida.cn/article/gsidee.html