-1

我正在尝试实现一个已经在Hiveweekofyear()中为 Teradata 编写的查询,并且到目前为止一直在使用该方法作为替代TD_WEEK_OF_CALENDAR方法,该方法返回一个 INTEGER 值,该值表示自 1900 年 1 月 1 日(包括 1900 年 1 月 1 日)以来的整周数,其中第一个部分周为 0。

我在 Hive 中找不到与此方法相关的任何其他预定义 UDF。即使是用 Java 编写自定义 UDF,我也无法获得TD_WEEK_OF_CALENDAR.

有人可以帮忙吗?

4

1 回答 1

0

这可以使用 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;
} 
于 2015-04-28T06:58:41.180 回答