为什么80%的码农都做不了架构师?>>>   

今天同事在oozie的workflow中执行一个hive查询,但是直接就报异常:Variable substitution depth too large:40,从网上查询可知,可以确认是由于语句中使用了过多的变量导致,在hive以前的版本中,这个限制是写死的40个,查询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 valuenew_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)

转载于:https://my.oschina.net/crxy/blog/396778

hive的变量传递设置相关推荐

  1. uboot环境变量(设置bootargs向linux内核传递正确的参数)

    http://blog.csdn.net/workhorse/article/details/7071428 这是我uboot的环境变量设置,在该设置下可以运行initram内核(从内存下载到nand ...

  2. php5的mysqli函数第二个参数,关于php:我应该将$ mysqli变量传递给每个函数吗?

    我从mysql_ *传递到面向对象的mysqli时遇到了一些问题. 我的index.php文件的结构类似于包括两个文件: include('connect.php'); include('functi ...

  3. 自定义函数变量的设置(*/**),lambda匿名函数(map/filter/zip/enumerate)

    自定义函数变量的设置 一个星号 *传入元组,且这个变量为可变变量 两个星号 **后的那些参数被当做字典类型传递到函数中 带有双星号的可变参数只能出现在参数列表的最后 注意双星号是字典类型(字典形式要有 ...

  4. linux查看本机所有预设的系统变量,如何设置与查看Linux系统中的环境变量?

    大家都知道,在 Linux 系统中,有环境变量和 Shell 变量这两种变量. 环境变量是在程序及其子程序中全局可用的,常常用来储存像默认的文本编辑器或者浏览器,以及可执行文件的路径等等这样的信息.而 ...

  5. 通过transmittable-thread-local源码理解线程池线程本地变量传递的原理

    前提 最近一两个月花了很大的功夫做UCloud服务和中间件迁移到阿里云的工作,没什么空闲时间撸文.想起很早之前写过ThreadLocal的源码分析相关文章,里面提到了ThreadLocal存在一个不能 ...

  6. linux如何查看桌面环境变量,如何设置和查看Linux系统的环境变量

    在 Linux 系统中,有环境变量和 Shell 变量这两种变量.环境变量是在程序及其子程序中全局可用的,常常用来储存像默认的文本编辑器或者浏览器,以及可执行文件的路径等等这样的信息.而 Shell ...

  7. php 检测 变量是否设置,PHP中检测一个变量是否有设置的函数是什么?

    汪汪一只猫 PHP的isset()函数 一般用来检测变量是否设置 格式:bool isset ( mixed var [, mixed var [, ...]] ) 功能:检测变量是否设置 返回值: ...

  8. (PHP 4, PHP 5) isset — 检测变量是否设置

    2019独角兽企业重金招聘Python工程师标准>>> 说明 bool isset    ( mixed $var   [, mixed $...  ] ) 检测变量是否设置,并且不 ...

  9. java 环境变量的设置

    许多操作系统使用环境变量传递配置信息到应用程序,就像java平台的属性一样,也是键值对存在的. 例如Path,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外 ...

最新文章

  1. C++ 重载运算符 operator
  2. 嗨:VSCode和IDEA都请安装上这个神奇的插件
  3. 一个丧心病狂的Github项目:东北话编程,大写的服!
  4. Java消息服务JMS详解
  5. linux 安装包 在此作用域中尚未声明_Linux运行go项目报错:copy_file_range: bad file descriptor...
  6. hive hql文档_30分钟入门 Hive SQL(HQL 入门篇)
  7. swift通知栏推送_如何使用Swift使用推送通知构建食品交付应用
  8. java 树同构_有根树的同构 和 无根树的同构
  9. openresty 搭建
  10. python 中的 [-1::1] 啥意思
  11. 介绍几个 window 下面的terminal
  12. 20个优秀的 HTML5 网站设计案例欣赏
  13. 3GPP协议R15完整版下载
  14. ActiveMQ的基础
  15. springboot项目结构_从零搭建Spring Boot脚手架(1):开篇以及技术选型
  16. 前端HTML CSS JavaScipt JQuery
  17. [禅悟人生]在劳动中品味幸福
  18. sincerit 王者荣耀(01背包)
  19. 冯扬文:船用燃料油价格大涨对我省航运企业的影响
  20. 突发!incaseformat蠕虫病毒来袭,警惕文件遭删除

热门文章

  1. 简单说一下什么是回流和重绘
  2. Linux系统下的文件管理类常命令及使用方式
  3. C#调用API向外部程序发送数据(转载)
  4. 转Python 标准库 urllib2 的使用细节
  5. [JavaWeb基础] 018.Struts2 Action通配符使用
  6. matlab 清楚屏幕,在shell中清除屏幕
  7. 做服务器_码迷SEO:细数那些做SEO巨坑的服务器们
  8. python字典键值可以是元组吗_python元组与字典
  9. mysql索引查询 with_mysql的select语句总结与索引使用
  10. G41显卡Linux驱动,Intel最新G41/G43/G45集成显卡驱动下载