hive宏未返回预期结果

uinbv5nw  于 2021-05-30  发布在  Hadoop
关注(0)|答案(1)|浏览(466)

我正在使用配置单元临时宏来帮助处理日期代数(在本例中查找上个月的第一天),并且得到了意想不到的结果。
创建临时宏month1st\u sub(日期)
铸造(混凝土)(
案例
当月(dt)=1时,则将年(dt)-1转换为字符串
else cast(年份(dt)字符串)
结束,
"-",
案例
当月(dt)=1时,则为“12”
else cast(月(dt)-1作为字符串)
结束,
"-01"
)截止日期)
;
当我使用vars表测试此宏时,vars表包含max_dt(8-15-2014)的单个值,使用以下公式:
选择
最大\u dt,
第1个月(cast(“2013-1-1”截止日期)),
第一个月(最大日期),
第1个月(cast(“2013-1-1”截止日期)),
第1个月(cast(“2013-4-1”截止日期)),
第1个月(cast(“2013-5-1”截止日期)),
第1个月(cast(“2013-6-1”截止日期))
来自VAR;
我收到以下输出:
最大dt c1 c2 c3 C4C5C6
2013-08-01 2012-12-01 2013-07-01 2012-12-01 2013-03-01 2013-04-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:我做错什么了吗?如果不是,这是一个问题与Hive或可能是一些环境问题?
问题2:hive中的临时宏功能是否足够可靠,可以使用,或者我应该编写javaudf来实现这一点?

vulvrdjw

vulvrdjw1#

老问题,我知道。
宏实现中有许多重要的错误,主要应该通过2.1.0解决。从https://cwiki.apache.org/confluence/display/hive/languagemanual+ddl.
从Hive0.12.0开始。
错误修复:在hive 1.3.0和2.0.0之前:
当处理同一行时多次使用hiveql宏时,即使参数不同,hive也会为所有调用返回相同的结果(见hive-11432。)
在Hive1.3.0和2.0.0之前:当处理同一行时使用多个宏时,ORDERBY子句可能会给出错误的结果(见hive-12277。)
在Hive2.1.0之前:当处理同一行时使用多个宏时,后面宏的结果将被第一个宏的结果覆盖(见hive-13372。)
我建议将配置单元更新为这两个版本之一,以解决您的问题。

相关问题