与Hive中的add_months函数不一致?

时间:2016-11-11 07:12:16

标签: date hadoop hive hql

我已经潜伏了一段时间,但最后还有我自己的问题,我在这里或谷歌上找不到。为我缺乏经验而道歉,离学校只有几年。使用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如何正常工作? (apache链接:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-DateFunctions)。另外,如果我在add_months结果=' 2014-04-30'中包含另一个where语句,我会得到返回的行,它实际上显示了2015-05-01'。飞快的是什么?

如果我在表面上更改查询(简化它或使其更复杂,但让它基本上做同样的事情),有时结果会改变。任何人都可以尝试复制这个并让我知道我不只是疯了吗?在我的结尾有什么样的种类或任何东西可能搞砸了吗?

1 个答案:

答案 0 :(得分:0)

使用日期时,使用DATE格式的游戏,因此引擎会照顾其他内容,例如闰年或几个月等。(添加/减少)

确保您的字段没有空格或特殊字符,我有以下内容并且完美运行

文件     ClientID1,2015-01,1     ClientID2,2015-02,1     ClientID3,2015-04,1     ClientID4,2015-04,1     ClientID5,2015-05,1     ClientID6,2015-06,1     ClientID7,2015-07,1     ClientID8,2015-08,1     ClientID9,2015-09,1     ClientID10,2015-10,1     ClientID11,2015-11,1     ClientID12,2015-12,1

Create table date_nov (client String, datemonth String, x int )  ROW FORMAT     DELIMITED FIELDS TERMINATED BY ",";
LOAD DATA INPATH '/user/root/date_nov.txt' into TABLE date_nov ;

hive> select * from date_nov;
OK
ClientID1        2015-01        1
ClientID2        2015-02        1
ClientID3        2015-04        1
ClientID4        2015-04        1
ClientID5        2015-05        1
ClientID6        2015-06        1
ClientID7        2015-07        1
ClientID8        2015-08        1
ClientID9        2015-09        1
ClientID10       2015-10        1
ClientID11       2015-11        1
ClientID12       2015-12        1

select * , add_months(to_DATE(concat(trim(datemonth),'-01' )),x)   from date_nov;

---------------------------------------