我使用Hive临时宏来帮助进行日期代数(在本例中是前一个月的第一天),并且得到了意想不到的结果。
创建临时宏month1st_sub(dt日期) 铸(凹槽) 案例 当月份(Dt)=1时,则转换为(年份(Dt)-1为字符串) 其他转换(年份(Dt)为字符串) 结束, "-“ 案例 当月份(Dt)=1,然后"12“ 其他转换(月份(Dt)-1为字符串) 结束, "-01“ )作为日期) ;
当我使用包含max_dt单个值的vars表(8-15-2014)测试此宏时,使用如下方法:
选择 max_dt, month1st_sub(cast("2013-1-1“为日期), month1st_sub(max_dt) month1st_sub(cast("2013-1-1“为日期), month1st_sub(cast("2013-4-1“为日期), month1st_sub(cast("2013-5-1“为日期), month1st_sub(cast("2013-6-1“为日期)) 来自vars;
我收到以下输出:
max_dt _c1 _c2 _c3 _c4 _c5 _c6 2013-08-01 2012-12-01 2013-07-01
最后一次返回的值为2013-07-01,应为2013-05-01.如果删除6-1行,则5-1行将返回2013-07-01,此错误是可重复的。此问题似乎始终与一组宏调用的最后返回值有关。
我使用的设置如下:
设置hive.cli.print.header=true; 设置mapreduce.input.fileinputformat.split.maxsize=10000000; 集合hive.auto.convert.join = true; 设置hive.exec.dynamic.partition.mode=nonstrict;
问题1:我做错什么了吗?如果不是,这是蜂巢的问题,还是可能是一些环境问题?
问题2: hive中的临时宏功能是否足够值得信任,可以使用,还是应该编写java udfs来实现?
发布于 2017-01-11 13:08:05
老问题,我知道。
宏实现中有许多重要的错误,大部分应该在2.1.0之前解决。来自https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL。
截至蜂巢0.12.0。 错误修复:在Hive 1.3.0和2.0.0之前: 当处理同一行时多次使用HiveQL宏时,即使参数不同,Hive也会对所有调用返回相同的结果。(见蜂箱-11432。) 在Hive 1.3.0和2.0.0之前:当处理同一行时使用多个宏时,ORDER子句可能会给出错误的结果。(见蜂箱-12277。) 在Hive2.1.0之前:当处理同一行时使用多个宏时,后面的宏的结果被第一个宏的结果覆盖。(见蜂箱-13372。)
我建议将hive更新到这两个版本中的一个,以解决您的问题。
https://stackoverflow.com/questions/25612739
复制相似问题