日历的td\u week\u对应的配置单元

ddrv8njm  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(388)

我正在尝试实现一个已经在hive中为teradata编写并正在使用的查询 weekofyear() 直到现在作为替代品 TD_WEEK_OF_CALENDAR 方法,该方法返回一个整数值,该整数值表示自1900年1月1日(含)起的整周数,其中第一个部分周为0。
我在配置单元中找不到与此方法相关的任何其他预定义自定义项。即使是用java编写自定义udf,我也无法获得 TD_WEEK_OF_CALENDAR .
有人能帮忙吗?

sg2wtvxw

sg2wtvxw1#

这可以通过使用joda时间函数来实现。但是hive不支持joda时间jar,您需要显式地将joda时间jar添加到hive lib文件夹中。
函数td\u week\u of \u 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;
}

相关问题