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 的配置单元等效项的主要内容,如果未能解决你的问题,请参考以下文章

如何使用配置单元外部配置单元表创建一个空数据框?

从另一个配置单元表刷新一个配置单元表

如何选择配置单元中具有不同 2 列的配置单元中的所有值

通过 DataFrames 从配置单元视图与配置单元表读取时的性能考虑

如何使用配置单元上下文有效地查询 Spark 中的配置单元表?

1.3配置存储单元