【问题标题】:hive equivalent for TD_WEEK_OF_CALENDARTD_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 到底是做什么的?
  • 认为知道 TD_WEEK_OF_CALENDAR 功能的人会回答。它计算 1900-01-01 和作为参数提供给它的日期字符串之间的 COMPLETE 周总数。提供的链接中给出的方法只需要天差,将其除以 7 并给出与答案不完全匹配的结果

标签: sql hadoop hive udf


【解决方案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;
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-23
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多