【问题标题】:Hive macro not returning expected resultsHive 宏未返回预期结果
【发布时间】: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 来做到这一点?

【问题讨论】:

标签: hadoop macros hive hiveql


【解决方案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 更新到这两个版本之一来解决您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 2010-09-22
    • 2021-05-17
    • 2018-02-19
    • 2018-03-23
    • 2020-03-15
    • 1970-01-01
    相关资源
    最近更新 更多