package com.facebook.hive.udf;
import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
/**
* Return the integer corresponding to day-of-week for a given datestamp.
* 0 is Sunday. NULL returns NULL.
*
*/
@Description(name = "udfdstoffset",
value = "_FUNC_(year, month, day) - Return the offset (in seconds) due to daylight savings for a day. Also takes an array representing these.\n")
public class UDFDstOffset extends UDF {
public Integer evaluate(Integer year, Integer month, Integer day) {
if (year == null || month == null || month < 1 || month > 12 || day == null || day < 1 || day > 31) {
return null;
}
Calendar date = new GregorianCalendar(year, month-1, day);
return date.get(Calendar.DST_OFFSET) / 1000; //Starts in ms
}
public Integer evaluate(ArrayList<String> datearr) throws UDFArgumentException {
if (datearr.size() != 3) {
throw new UDFArgumentException("Must provide a size-3 array, containing Year, Month, and Day in order.");
}
Integer year = Integer.parseInt(datearr.get(0));
Integer month = Integer.parseInt(datearr.get(1));
Integer day = Integer.parseInt(datearr.get(2));
if (year == null || month == null || month < 1 || month > 12 || day == null || day < 1 || day > 31) {
return null;
}
Calendar date = new GregorianCalendar(year, month, day);
return date.get(Calendar.DST_OFFSET) / 1000; //Starts in ms so integer div is ok
}
}