Skip to content

Commit be6a375

Browse files
committed
revise type of day function
1 parent c374c95 commit be6a375

File tree

3 files changed

+258
-44
lines changed

3 files changed

+258
-44
lines changed
Lines changed: 26 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,23 @@
11
package 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;
46
import org.apache.hadoop.hive.ql.exec.UDF;
57
import org.apache.hadoop.hive.serde2.io.TimestampWritable;
68
import org.apache.hadoop.io.IntWritable;
79
import org.apache.hadoop.io.Text;
810
import 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
*/
1918
public 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
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package cc.shanruifeng.functions.utils;
2+
3+
import cc.shanruifeng.functions.model.ChinaIdArea;
4+
import com.google.common.base.Strings;
5+
import com.google.common.collect.Lists;
6+
import com.google.common.collect.Maps;
7+
import com.google.common.io.Closer;
8+
import java.io.BufferedReader;
9+
import java.io.IOException;
10+
import java.io.InputStream;
11+
import java.io.InputStreamReader;
12+
import java.util.ArrayList;
13+
import java.util.List;
14+
import java.util.Map;
15+
import org.slf4j.Logger;
16+
import org.slf4j.LoggerFactory;
17+
18+
/**
19+
* @author ruifeng.shan
20+
* @date 2016-07-07
21+
* @time 16:21
22+
*/
23+
public class ConfigUtils {
24+
private static Logger logger = LoggerFactory.getLogger(ConfigUtils.class);
25+
26+
public static List<String> loadFile(String fileName) throws IOException {
27+
ArrayList<String> strings = Lists.newArrayList();
28+
Closer closer = Closer.create();
29+
try {
30+
InputStream inputStream = ConfigUtils.class.getResourceAsStream(fileName);
31+
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
32+
closer.register(bufferedReader);
33+
String line;
34+
while ((line = bufferedReader.readLine()) != null) {
35+
if (Strings.isNullOrEmpty(line) || line.startsWith("#")) {
36+
continue;
37+
}
38+
strings.add(line);
39+
}
40+
} catch (IOException e) {
41+
logger.error("loadFile {} error. error is {}.", fileName, e);
42+
throw e;
43+
} finally {
44+
closer.close();
45+
}
46+
47+
return strings;
48+
}
49+
50+
public static Map<String, ChinaIdArea> getIdCardMap() {
51+
String fileName = "/china_p_c_a.config";
52+
Map<String, ChinaIdArea> map = Maps.newHashMap();
53+
try {
54+
List<String> list = loadFile(fileName);
55+
for (String line : list) {
56+
String[] results = line.split("\t", 4);
57+
map.put(results[0], new ChinaIdArea(results[1], results[2], results[3]));
58+
}
59+
} catch (IOException e) {
60+
logger.error("get china id card map error. error is {}.", e);
61+
return map;
62+
}
63+
64+
return map;
65+
}
66+
67+
public static Map<String, String> getDayMap() {
68+
String fileName = "/china_day_type.config";
69+
Map<String, String> map = Maps.newHashMap();
70+
try {
71+
List<String> list = loadFile(fileName);
72+
for (String line : list) {
73+
String[] results = line.split("\t", 2);
74+
map.put(results[0], results[1]);
75+
}
76+
} catch (IOException e) {
77+
logger.error("get day map error. error is {}.", e);
78+
return map;
79+
}
80+
81+
return map;
82+
}
83+
}
Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
2013-01-01 holiday
2+
2013-01-02 holiday
3+
2013-01-03 holiday
4+
2013-01-05 workday
5+
2013-01-06 workday
6+
2013-02-09 holiday
7+
2013-02-10 holiday
8+
2013-02-11 holiday
9+
2013-02-12 holiday
10+
2013-02-13 holiday
11+
2013-02-14 holiday
12+
2013-02-15 holiday
13+
2013-02-16 workday
14+
2013-02-17 workday
15+
2013-04-04 holiday
16+
2013-04-05 holiday
17+
2013-04-06 holiday
18+
2013-04-07 workday
19+
2013-04-27 workday
20+
2013-04-28 workday
21+
2013-04-29 holiday
22+
2013-04-30 holiday
23+
2013-05-01 holiday
24+
2013-06-08 workday
25+
2013-06-09 workday
26+
2013-06-10 holiday
27+
2013-06-11 holiday
28+
2013-06-12 holiday
29+
2013-09-19 holiday
30+
2013-09-20 holiday
31+
2013-09-21 holiday
32+
2013-09-22 workday
33+
2013-09-29 workday
34+
2013-10-01 holiday
35+
2013-10-02 holiday
36+
2013-10-03 holiday
37+
2013-10-04 holiday
38+
2013-10-05 holiday
39+
2013-10-06 holiday
40+
2013-10-07 holiday
41+
2013-10-12 workday
42+
2014-01-01 holiday
43+
2014-01-21 holiday
44+
2014-01-26 workday
45+
2014-02-01 holiday
46+
2014-02-02 holiday
47+
2014-02-03 holiday
48+
2014-02-04 holiday
49+
2014-02-05 holiday
50+
2014-02-06 holiday
51+
2014-02-08 workday
52+
2014-04-05 holiday
53+
2014-04-06 holiday
54+
2014-04-07 holiday
55+
2014-05-01 holiday
56+
2014-05-02 holiday
57+
2014-05-03 holiday
58+
2014-05-04 workday
59+
2014-05-31 holiday
60+
2014-06-01 holiday
61+
2014-06-02 holiday
62+
2014-09-06 holiday
63+
2014-09-07 holiday
64+
2014-09-08 holiday
65+
2014-09-28 workday
66+
2014-10-01 holiday
67+
2014-10-02 holiday
68+
2014-10-03 holiday
69+
2014-10-04 holiday
70+
2014-10-05 holiday
71+
2014-10-06 holiday
72+
2014-10-07 holiday
73+
2014-10-11 workday
74+
2015-01-01 holiday
75+
2015-01-02 holiday
76+
2015-01-03 holiday
77+
2015-01-04 workday
78+
2015-02-15 workday
79+
2015-02-18 holiday
80+
2015-02-19 holiday
81+
2015-02-20 holiday
82+
2015-02-21 holiday
83+
2015-02-22 holiday
84+
2015-02-23 holiday
85+
2015-02-24 holiday
86+
2015-02-28 workday
87+
2015-04-04 holiday
88+
2015-04-05 holiday
89+
2015-04-06 holiday
90+
2015-05-01 holiday
91+
2015-05-02 holiday
92+
2015-05-03 holiday
93+
2015-06-20 holiday
94+
2015-06-21 holiday
95+
2015-06-22 holiday
96+
2015-09-03 holiday
97+
2015-09-04 holiday
98+
2015-09-05 holiday
99+
2015-09-06 workday
100+
2015-09-26 holiday
101+
2015-09-27 holiday
102+
2015-10-01 holiday
103+
2015-10-02 holiday
104+
2015-10-03 holiday
105+
2015-10-04 holiday
106+
2015-10-05 holiday
107+
2015-10-06 holiday
108+
2015-10-07 holiday
109+
2015-10-10 workday
110+
2016-01-01 holiday
111+
2016-01-02 holiday
112+
2016-01-03 holiday
113+
2016-01-04 workday
114+
2016-02-06 workday
115+
2016-02-07 holiday
116+
2016-02-08 holiday
117+
2016-02-08 holiday
118+
2016-02-09 holiday
119+
2016-02-10 holiday
120+
2016-02-11 holiday
121+
2016-02-12 holiday
122+
2016-02-13 holiday
123+
2016-02-14 workday
124+
2016-04-02 holiday
125+
2016-04-03 holiday
126+
2016-04-04 holiday
127+
2016-04-30 holiday
128+
2016-05-01 holiday
129+
2016-05-02 holiday
130+
2016-06-09 holiday
131+
2016-06-10 holiday
132+
2016-06-11 holiday
133+
2016-06-12 workday
134+
2016-09-15 holiday
135+
2016-09-16 holiday
136+
2016-09-17 holiday
137+
2016-09-18 workday
138+
2016-10-01 holiday
139+
2016-10-02 holiday
140+
2016-10-03 holiday
141+
2016-10-04 holiday
142+
2016-10-05 holiday
143+
2016-10-06 holiday
144+
2016-10-07 holiday
145+
2016-10-08 workday
146+
2016-10-09 workday
147+
2017-01-01 holiday
148+
2017-01-02 holiday
149+
2017-01-03 holiday

0 commit comments

Comments
 (0)