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 宏未返回预期结果的主要内容,如果未能解决你的问题,请参考以下文章

Hive 中的左连接未返回预期结果

为啥这个 Hive 代码返回 0 个结果?

Spark 上的 Hive 不返回聚合或连接查询的结果

通过 Pyspark 查询 Hive 返回空结果

PDO 不返回任何结果,而 MySQL 命令行返回预期结果

Hive 按字母排序