背景:
根据《Hive权威指南》上讲,在hive-0.8.0以后可以使用--define key=value命令定义用户自定义的变量以便在Hive脚本中引用。当用户使用这个功能时,Hive会将这个键值对放在hivevar命名空间下。并且,hivevar这个命名空间在使用过程中是可选的,也就是说可写可不写,自定义的变量都会放在hivevar这个命名空间下。
为了支持上面的观点,书上做了下面的操作。我为了亲自体会,使用的是hive-0.13.0。
1.使用hive --define foo=bar语句,在hive中定义一个变量名为foo,值为bar;
效果图如下:
2.使用set foo;查看变量foo的值,从效果图可以看出,foo的值确实为bar。
效果图如下:
3.再使用set hivevar:foo;查看hivevar命名空间下的变量foo的值,从效果图可以看出,hivevar命名空间下的变量foo的值确实为bar。测试到这里,已经可以给人感觉加不加hivevar:这个命名空间名结果都是一样的。
效果图如下:
4.书中为了更确定的证明结论的正确性,又使用set hivavar:foo=bar2;改变foo的值,并使用set fool;和set hivevar:foo;查看不带命名空间和带命名空间的foo的值是否都已经改变。根据效果图可以看出,两个foo确实已经改变,证毕。于是书中给了开篇所说的结论。
效果图如下:
5.注意:下面我们来分析一下,既然hivevar:命名空间是可选的,那么我们使用set foo=bar3;再次改变foo的值,带命名空间和不带命名空间的foo的值都应该变成bar3,下面我们做此测试,根据效果图可以看到,结果并不如我们推测的那样,而是不带命名空间的foo值变成了bar3,带命名空间的foo的值竟然没有变化!
效果图如下:
结论:
“在hive中使用set操作自定义变量时,hivevar:命名空间不是可选的,应该是在使用set定义变量时时刻加hivevar:命名空间,以免出现难以找出的错误。”
附加:
“因为--define key=value实际上与--hivevar key=value是等价的,所以无论你习惯使用上面哪个操作自定义变量,都要加命名空间,不然都存在以上说的问题”