Hive 宏未返回预期结果
Posted
技术标签:
【中文标题】Hive 宏未返回预期结果【英文标题】:Hive macro not returning expected results 【发布时间】: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 路线,因为它似乎更成熟了。 【参考方案1】:老问题,我知道。
宏实现中存在许多重大错误,这些错误大部分应由 2.1.0 解决。来自https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL。
从 Hive 0.12.0 开始。
错误修复:在 Hive 1.3.0 和 2.0.0 之前:
当处理同一行时多次使用 HiveQL 宏时, Hive 为所有调用返回相同的结果,即使 论点不同。 (参见 HIVE-11432。)
在 Hive 1.3.0 和 2.0.0 之前: 在处理同一行时使用多个宏时,ORDER BY 子句可能会给出错误的结果。 (参见 HIVE-12277。)
在 Hive 2.1.0 之前: 在处理相同的宏时使用了多个宏 行,后面的宏的结果被 第一的。 (参见 HIVE-13372。)
我建议将 hive 更新到这两个版本之一来解决您的问题。
【讨论】:
以上是关于Hive 宏未返回预期结果的主要内容,如果未能解决你的问题,请参考以下文章