【发布时间】:2014-09-01 20:48:55
【问题描述】:
我正在使用 Hive 临时宏来帮助处理日期代数(在这种情况下查找上个月的第一天),我得到了意想不到的结果。
创建临时宏month1st_sub(dt date)
演员(连续(
案例
当月(dt) = 1 时强制转换(年(dt)-1 作为字符串)
else cast(year(dt) as string)
结束,
"-",
案例
当月(dt)= 1 时,则为“12”
else cast(month(dt)-1 as string)
结束,
“-01”
) 作为日期)
;
当我使用包含 max_dt (8-15-2014) 的单个值的 vars 表测试此宏时,使用以下命令:
选择
最大值,
month1st_sub(cast("2013-1-1" as date)),
month1st_sub(max_dt),
month1st_sub(cast("2013-1-1" as date)),
month1st_sub(cast("2013-4-1" as date)),
month1st_sub(cast("2013-5-1" as date)),
month1st_sub(cast("2013-6-1" as date))
来自变量;
我收到以下输出:
最大_dt _c1 _c2 _c3 _c4 _c5 _c6
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 中的临时宏功能是否值得使用,或者我应该编写 java udfs 来做到这一点?
【问题讨论】:
-
我不确定宏为什么不起作用,但您始终可以为此编写 UDF。这是一个好的开始 - github.com/nexr/hive-udf/blob/master/src/main/java/com/nexr/…
-
谢谢@visakh,我真正关心的是输出的不一致。我想我现在会走 JAVA UDF 路线,因为它似乎更成熟了。