在 Hive 中查找一个月的最后一天
Posted
技术标签:
【中文标题】在 Hive 中查找一个月的最后一天【英文标题】:Find last day of a month in Hive 【发布时间】:2013-07-09 12:48:48 【问题描述】:我的问题是:有没有办法在 Hive 中找到一个月的最后一天,比如 Oracle SQL 函数? :
LAST_DAY(D_Dernier_Jour)
谢谢。
【问题讨论】:
【参考方案1】:从 Hive 1.1.0 开始,last_day(string date)
功能可用。
last_day(string date)
返回日期所属的一个月的最后一天。 date 是格式为“yyyy-MM-dd HH:mm:ss”或“yyyy-MM-dd”的字符串。日期的时间部分被忽略。
【讨论】:
【参考方案2】:您可以使用 Nexr 提供的last_day(dateString)
UDF。它根据具有 yyyy-MM-dd HH:mm:ss 模式的日期字符串返回该月的最后一天。
Example:
SELECT last_day('2003-03-15 01:22:33') FROM src LIMIT 1;
2003-03-31 00:00:00
您需要从他们的Github Repository 中提取它并构建。他们的 wiki 页面包含有关如何使用 Hive 构建和使用它的所有信息。
HTH
【讨论】:
【参考方案3】:如果您想避免自定义 UDF,下面是另一种解决方案:
to_date(date_sub(add_months(concat(from_unixtime(unix_timestamp('2015-07-28','yyyy-MM-dd'), 'yyyy-MM'),'-01'),1),1))
【讨论】:
【参考方案4】:像下面这样的东西可以给你一些灵感。该代码将为您提供上个月的最后一天。您可以采用它来获取您想要的任何一个月的最后一天。
date_sub(concat(from_unixtime(unix_timestamp(), 'yyyy-MM'), '-01'), 1)
【讨论】:
【参考方案5】:select
CASE WHEN month(FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd')) IN(4,6,9,11)
THEN
date_add((FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd')),30 - day(FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd')))
WHEN month(FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd')) IN(1,3,5,7,8,10,12)
THEN
date_add((FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd')),31 - day(FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd')))
WHEN month(FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd')) = 2 and day(FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd'))=28
THEN
date_add((FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd')),28 - day(FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd')))
WHEN month(FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd')) = 2 and day(FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd'))=29
THEN
date_add((FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd')),29 - day(FROM_UNIXTIME(UNIX_TIMESTAMP(),'yyyy-MM-dd')))
END as calc_date from table_name
limit 2;
【讨论】:
【参考方案6】:我认为您可以在 Hive 查询 to_date(string timestamp) 中使用此 UDF。例如:-返回时间戳字符串的日期部分:to_date("1970-01-01 00:00:00") = "1970-01-01"。现在您需要编写一个 UDF say(即 lastDay),它将实现以下内容:-
Date today = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(today);
calendar.add(Calendar.MONTH, 1);
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.add(Calendar.DATE, -1);
Date lastDayOfMonth = calendar.getTime();
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(lastDayOfMonth)
现在你的 UDF 将是这样的:-
select lastDay(to_date(string timestamp)) from xxx;
我希望这会对你的事业有所帮助
【讨论】:
以上是关于在 Hive 中查找一个月的最后一天的主要内容,如果未能解决你的问题,请参考以下文章