package com.github.aaronshan.functions.date; import org.apache.hadoop.hive.ql.exec.Description; import org.apache.hadoop.hive.ql.exec.UDF; import org.apache.hadoop.hive.serde2.io.TimestampWritable; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.joda.time.LocalDate; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import java.util.Calendar; /** * @author ruifeng.shan * date: 15-8-31 */ @Description(name = "day_of_week" , value = "_FUNC_(date) - day of week. if monday, return 1, tuesday return 2 ... sunday return 7." , extended = "Example:\n > select _FUNC_(date_string) from src;\n > select _FUNC_(date) from src;") public class UDFDayOfWeek extends UDF { public final static DateTimeFormatter DEFAULT_DATE_FORMATTER = DateTimeFormat.forPattern("yyyy-MM-dd"); private IntWritable result = new IntWritable(); public UDFDayOfWeek() { } /** * Get the day of week from a date string. * * @param dateString the dateString in the format of "yyyy-MM-dd". * @return an int from 0 to 6(0 = Monday, 1 = Tuesday, … 6 = Sunday). null if the dateString is not a valid date * string. */ public IntWritable evaluate(Text dateString) { if (dateString == null) { return null; } try { LocalDate date = LocalDate.parse(dateString.toString(), DEFAULT_DATE_FORMATTER); result.set(date.getDayOfWeek()); return result; } catch (Exception e) { return null; } } public IntWritable evaluate(TimestampWritable t) { if (t == null) { return null; } Calendar calendar = Calendar.getInstance(); calendar.setTime(t.getTimestamp()); LocalDate date = LocalDate.fromCalendarFields(calendar); result.set(date.getDayOfWeek()); return result; } }