11package cc .shanruifeng .functions .date ;
22
3- import com .google .common .collect .ImmutableMap ;
3+ import cc .shanruifeng .functions .utils .ConfigUtils ;
4+ import java .util .Calendar ;
5+ import java .util .Map ;
46import org .apache .hadoop .hive .ql .exec .UDF ;
57import org .apache .hadoop .hive .serde2 .io .TimestampWritable ;
68import org .apache .hadoop .io .IntWritable ;
79import org .apache .hadoop .io .Text ;
810import org .joda .time .LocalDate ;
9-
10- import java .text .SimpleDateFormat ;
11- import java .util .Calendar ;
12- import java .util .Date ;
13- import java .util .Map ;
11+ import org .joda .time .format .DateTimeFormat ;
12+ import org .joda .time .format .DateTimeFormatter ;
1413
1514/**
1615 * @author ruifeng.shan
1716 * @date 15-9-1
1817 */
1918public class UDFTypeOfDay extends UDF {
20- public static final Map <String , Boolean > holidayDayMap = ImmutableMap .<String , Boolean >builder ().put ("20130101" , true ).put ("20130102" , true ).put ("20130103" , true )
21- .put ("20130209" , true ).put ("20130210" , true ).put ("20130211" , true ).put ("20130212" , true ).put ("20130213" , true ).put ("20130214" , true ).put ("20130215" , true )
22- .put ("20130404" , true ).put ("20130405" , true ).put ("20130406" , true ).put ("20130429" , true ).put ("20130430" , true ).put ("20130501" , true ).put ("20130610" , true )
23- .put ("20130611" , true ).put ("20130612" , true ).put ("20130919" , true ).put ("20130920" , true ).put ("20130921" , true ).put ("20131001" , true ).put ("20131002" , true )
24- .put ("20131003" , true ).put ("20131004" , true ).put ("20131005" , true ).put ("20131006" , true ).put ("20131007" , true ).put ("20140101" , true ).put ("20140121" , true )
25- .put ("20140201" , true ).put ("20140202" , true ).put ("20140203" , true ).put ("20140204" , true ).put ("20140205" , true ).put ("20140206" , true ).put ("20140405" , true )
26- .put ("20140406" , true ).put ("20140407" , true ).put ("20140501" , true ).put ("20140502" , true ).put ("20140503" , true ).put ("20140531" , true ).put ("20140601" , true )
27- .put ("20140602" , true ).put ("20140906" , true ).put ("20140907" , true ).put ("20140908" , true ).put ("20141001" , true ).put ("20141002" , true ).put ("20141003" , true )
28- .put ("20141004" , true ).put ("20141005" , true ).put ("20141006" , true ).put ("20141007" , true ).put ("20150101" , true ).put ("20150102" , true ).put ("20150103" , true )
29- .put ("20150218" , true ).put ("20150219" , true ).put ("20150220" , true ).put ("20150221" , true ).put ("20150222" , true ).put ("20150223" , true ).put ("20150224" , true )
30- .put ("20150404" , true ).put ("20150405" , true ).put ("20150406" , true ).put ("20150501" , true ).put ("20150502" , true ).put ("20150503" , true ).put ("20150620" , true )
31- .put ("20150621" , true ).put ("20150622" , true ).put ("20150903" , true ).put ("20150904" , true ).put ("20150905" , true ).put ("20150926" , true ).put ("20150927" , true )
32- .put ("20151001" , true ).put ("20151002" , true ).put ("20151003" , true ).put ("20151004" , true ).put ("20151005" , true ).put ("20151006" , true ).put ("20151007" , true )
33- .build ();
34- public static final Map <String , Boolean > workDayMap = ImmutableMap .<String , Boolean >builder ().put ("20130105" , true ).put ("20130106" , true )
35- .put ("20130216" , true ).put ("20130217" , true ).put ("20130407" , true ).put ("20130427" , true ).put ("20130428" , true ).put ("20130608" , true ).put ("20130609" , true )
36- .put ("20130922" , true ).put ("20130929" , true ).put ("20131012" , true ).put ("20140126" , true ).put ("20140208" , true ).put ("20140504" , true ).put ("20140928" , true )
37- .put ("20141011" , true ).put ("20150104" , true ).put ("20150215" , true ).put ("20150228" , true ).put ("20150906" , true ).put ("20151010" , true ).build ();
38-
39- private final SimpleDateFormat formatFrom = new SimpleDateFormat ("yyyyMMdd" );
19+ public final static DateTimeFormatter DEFAULT_DATE_FORMATTER = DateTimeFormat .forPattern ("yyyy-MM-dd" );
20+ public final static Map <String , String > dayMap = ConfigUtils .getDayMap ();
4021 private IntWritable result = new IntWritable ();
4122
4223 public UDFTypeOfDay () {
@@ -55,13 +36,13 @@ public IntWritable evaluate(Text dateString) {
5536 }
5637
5738 try {
58- if (holidayDayMap .containsKey (dateString .toString ())) {
39+ String value = dayMap .get (dateString .toString ());
40+ if (DayType .HOLIDAY .getCode ().equalsIgnoreCase (value )) {
5941 result .set (1 );
60- } else if (workDayMap . containsKey ( dateString . toString () )) {
42+ } else if (DayType . WORKDAY . getCode (). equalsIgnoreCase ( value )) {
6143 result .set (4 );
6244 } else {
63- Date dateFrom = formatFrom .parse (dateString .toString ());
64- LocalDate date = LocalDate .fromDateFields (dateFrom );
45+ LocalDate date = LocalDate .parse (dateString .toString (), DEFAULT_DATE_FORMATTER );
6546 if (date .getDayOfWeek () < 6 ) {
6647 result .set (3 );
6748 } else {
@@ -83,25 +64,26 @@ public IntWritable evaluate(TimestampWritable t) {
8364 try {
8465 Calendar calendar = Calendar .getInstance ();
8566 calendar .setTime (t .getTimestamp ());
86- String dateString = formatFrom .format (calendar .getTime ());
67+ LocalDate date = LocalDate .fromCalendarFields (calendar );
68+ String dateString = date .toString (DEFAULT_DATE_FORMATTER );
8769
88- if (holidayDayMap .containsKey (dateString )) {
89- result .set (1 );
90- } else if (workDayMap .containsKey (dateString )) {
91- result .set (4 );
92- } else {
93- LocalDate date = LocalDate .fromCalendarFields (calendar );
94- if (date .getDayOfWeek () < 6 ) {
95- result .set (3 );
96- } else {
97- result .set (2 );
98- }
99- }
70+ return evaluate (new Text (dateString ));
10071 } catch (Exception e ) {
10172 return null ;
10273 }
74+ }
75+
76+ private enum DayType {
77+ HOLIDAY ("holiday" ), WORKDAY ("workday" );
10378
79+ private String code ;
10480
105- return result ;
81+ private DayType (String code ) {
82+ this .code = code ;
83+ }
84+
85+ public String getCode () {
86+ return this .code ;
87+ }
10688 }
10789}
0 commit comments