【发布时间】:2016-11-11 07:12:16
【问题描述】:
我已经在 SO 上潜伏了一段时间,但最后有我自己的问题,我在这里或谷歌上找不到。对不起,我的经验不足,只有几年离开学校。使用 Hive 1.2,我遇到了 add_months 函数似乎无法正常/一致地工作的情况。
简单来说,我基本上有一个带有 clientid、yyyy-MM 和 int 的表。
select clientid, concat(yearmonth, '-01'), integer, add_months(concat(yearmonth, '-01'), integer)
from tablea
where yearmonth = '2015-04' group by clientid, yearmonth, integer;
我使用 where 语句,因为这似乎只影响 4 月和 11 月的日期。我发现会发生什么:
ClientID1, 2015-04-01, 1, 2015-05-01
ClientID2, 2015-04-01, 1, 2015-05-01
ClientID3, 2015-04-01, 1, 2015-05-01
ClientID4, 2015-04-01, 1, 2014-04-30
ClientID5, 2015-04-01, 1, 2014-04-30
ClientID6, 2015-04-01, 1, 2014-04-30
add_months 究竟是如何工作的? (阿帕奇链接:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-DateFunctions)。此外,如果我包含另一个 where 语句,其中 add_months 结果 = '2014-04-30',我会返回实际显示 '2015-05-01' 的行。到底发生了什么?
如果我从表面上更改查询(将其简化或使其更复杂但基本相同),有时结果会发生变化。任何人都可以尝试复制这个并让我知道我不只是疯了吗?是否有任何四舍五入的事情或任何事情可能会搞砸?
【问题讨论】:
-
试试
SELECT clientid, concat(yearmonth, '-01'), integer, add_months(CAST(concat(yearmonth, '-01') AS DATE), integer) FROM tablea WHERE yearmonth = '2015-04' GROUP BY clientid, yearmonth, integer; -
@MRSrinivas 我实际上正在考虑这样做。虽然我很困惑为什么它应该很重要,因为文档指出它需要日期/字符串/时间戳作为参数?不过现在会尝试。
-
@MRSrinivas 不走运;它似乎已经解决了 11 月而不是 4 月。我仍然对这只会影响某些月份的方式或原因感到困惑......