我正在尝试实现一个已经在 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/