sql - 相当于TD_WEEK_OF_CALENDAR的配置单元

标签 sql hadoop hive udf

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

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

有人可以帮忙吗?

最佳答案

这可以使用Joda时间功能来实现。但是Hive不支持Joda time jars,您需要将joda-time jars显式添加到您的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;
} 

关于sql - 相当于TD_WEEK_OF_CALENDAR的配置单元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29904985/

相关文章:

sql-server - 使用 SQL 中的外部表/Polybase 从外部源(Azure 存储 Blob)中选择数据。表已创建但未返回数据

hadoop - 将微策略连接到 Hive

SQL 查询 : Get average, 和所有高于某个值的平均值,在同一个查询中

sql - Postgres SQL 查询忽略索引?

Python 使用临时表运行 SQL 查询

sql - 来自嵌套连接的单行

Hadoop快照查询-删除&元数据信息

hadoop - 如何更改hadoop distcp登台目录

hadoop - hive 表存档

hive - 当hive表有多个分区字段时,如何只更新一个分区字段?