TD_WEEK_OF_CALENDAR 的配置单元等效项
Posted
技术标签:
【中文标题】TD_WEEK_OF_CALENDAR 的配置单元等效项【英文标题】:hive equivalent for TD_WEEK_OF_CALENDAR 【发布时间】:2015-04-27 20:06:59 【问题描述】:我正在尝试在 Hive 中实现已经为 Teradata 编写的查询,并且直到现在一直使用 weekofyear()
来替代 TD_WEEK_OF_CALENDAR
方法,该方法返回一个表示完整周数的 INTEGER 值自 1900 年 1 月 1 日起(包括 1900 年 1 月 1 日)这一周,其中第一个部分周为 0。
我在 Hive 中找不到与此方法相关的任何其他预定义 UDF。即使是用 Java 编写自定义 UDF,我也无法获得 TD_WEEK_OF_CALENDAR
的确切逻辑。
有人可以帮忙吗?
【问题讨论】:
TD_WEEK_OF_CALENDAR
到底是做什么的?
Hive date function to achieve day of week 的可能重复项
认为知道 TD_WEEK_OF_CALENDAR 功能的人会回答。它计算 1900-01-01 和作为参数提供给它的日期字符串之间的 COMPLETE 周总数。提供的链接中给出的方法只需要天差,将其除以 7 并给出与答案不完全匹配的结果
【参考方案1】:
这可以使用 Joda 时间函数来实现。但是 Hive 不支持 Joda time Jars,您需要将 joda-time jar 显式添加到您的 hive lib 文件夹中。
函数 TD_WEEK_OF_CALENDAR 将星期日视为一周的第一天,星期六视为最后一天,而 joda-time 函数 getDayOfWeek() 将星期日视为一周的最后一天,将其编号设为 7,这会将星期日拉到同一周。
下面的代码可以满足需要
public Text evaluate(Text input)
if(null != input)
String date = input.toString();
StringTokenizer st = new StringTokenizer(date, "-");
int year = Integer.parseInt(st.nextToken());
int month = Integer.parseInt(st.nextToken());
int day = Integer.parseInt(st.nextToken());
DateTime dateTime1 = new DateTime(1900, 1, 1, 0, 0, 0, 0);
DateTime dateTime2 = new DateTime(year, month, day, 0, 0, 0, 0);
int weeksDiff = dateTime2.getDayOfWeek() == 7 ? Weeks.weeksBetween(
dateTime1, dateTime2).getWeeks() + 1 : Weeks.weeksBetween(
dateTime1, dateTime2).getWeeks();
String weeks = weeksDiff + "";
return new Text(weeks);
else
return null;
【讨论】:
以上是关于TD_WEEK_OF_CALENDAR 的配置单元等效项的主要内容,如果未能解决你的问题,请参考以下文章
通过 DataFrames 从配置单元视图与配置单元表读取时的性能考虑