diff --git a/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFMonth.java b/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFMonth.java index efe5ee2..c85bb97 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFMonth.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFMonth.java @@ -20,8 +20,8 @@ import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.Calendar; import java.util.Date; +import org.joda.time.MutableDateTime; import org.apache.hadoop.hive.ql.exec.Description; import org.apache.hadoop.hive.ql.exec.UDF; @@ -52,7 +52,7 @@ @NDV(maxNdv = 31) public class UDFMonth extends UDF { private final SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); - private final Calendar calendar = Calendar.getInstance(); + private transient final MutableDateTime mdt = new MutableDateTime(); private final IntWritable result = new IntWritable(); @@ -74,8 +74,8 @@ public IntWritable evaluate(Text dateString) { } try { Date date = formatter.parse(dateString.toString()); - calendar.setTime(date); - result.set(1 + calendar.get(Calendar.MONTH)); + mdt.setMillis(date.getTime()); + result.set(mdt.getMonthOfYear()); return result; } catch (ParseException e) { return null; @@ -87,8 +87,8 @@ public IntWritable evaluate(DateWritable d) { return null; } - calendar.setTime(d.get()); - result.set(1 + calendar.get(Calendar.MONTH)); + mdt.setMillis(d.get().getTime()); + result.set(mdt.getMonthOfYear()); return result; } @@ -97,8 +97,8 @@ public IntWritable evaluate(TimestampWritable t) { return null; } - calendar.setTime(t.getTimestamp()); - result.set(1 + calendar.get(Calendar.MONTH)); + mdt.setMillis(t.getTimestamp().getTime()); + result.set(mdt.getMonthOfYear()); return result; } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFYear.java b/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFYear.java index de46104..cbd6d92 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFYear.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFYear.java @@ -20,8 +20,8 @@ import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.Calendar; import java.util.Date; +import org.joda.time.MutableDateTime; import org.apache.hadoop.hive.ql.exec.Description; import org.apache.hadoop.hive.ql.exec.UDF; @@ -52,7 +52,7 @@ @NDV(maxNdv = 20) // although technically its unbounded, its unlikely we will ever see ndv > 20 public class UDFYear extends UDF { private final SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); - private final Calendar calendar = Calendar.getInstance(); + private transient final MutableDateTime mdt = new MutableDateTime(); private final IntWritable result = new IntWritable(); @@ -76,8 +76,8 @@ public IntWritable evaluate(Text dateString) { try { Date date = formatter.parse(dateString.toString()); - calendar.setTime(date); - result.set(calendar.get(Calendar.YEAR)); + mdt.setMillis(date.getTime()); + result.set(mdt.getYear()); return result; } catch (ParseException e) { return null; @@ -89,8 +89,8 @@ public IntWritable evaluate(DateWritable d) { return null; } - calendar.setTime(d.get()); - result.set(calendar.get(Calendar.YEAR)); + mdt.setMillis(d.get().getTime()); + result.set(mdt.getYear()); return result; } @@ -99,8 +99,8 @@ public IntWritable evaluate(TimestampWritable t) { return null; } - calendar.setTime(t.getTimestamp()); - result.set(calendar.get(Calendar.YEAR)); + mdt.setMillis(t.getTimestamp().getTime()); + result.set(mdt.getYear()); return result; } diff --git a/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorDateExpressions.java b/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorDateExpressions.java index 9c4a751..8a60447 100644 --- a/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorDateExpressions.java +++ b/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorDateExpressions.java @@ -38,7 +38,9 @@ import org.junit.internal.runners.statements.Fail; import com.google.common.util.concurrent.ThreadFactoryBuilder; +import com.sun.tools.javac.resources.javac; +import java.sql.Date; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Calendar; @@ -53,6 +55,7 @@ public class TestVectorDateExpressions { private ExecutorService runner; + private static final int MAX_SANE_DATE_VALUE = new DateWritable(Date.valueOf("3000-01-01")).getDays(); /* copied over from VectorUDFTimestampFieldLong */ private TimestampWritable toTimestampWritable(long daysSinceEpoch) { @@ -78,11 +81,15 @@ private TimestampWritable toTimestampWritable(long daysSinceEpoch) { } private VectorizedRowBatch getVectorizedRandomRowBatch(int seed, int size) { + return getVectorizedRandomRowBatch(seed, size, Integer.MAX_VALUE); + } + + private VectorizedRowBatch getVectorizedRandomRowBatch(int seed, int size, int maxValue) { VectorizedRowBatch batch = new VectorizedRowBatch(2, size); LongColumnVector lcv = new LongColumnVector(size); Random rand = new Random(seed); for (int i = 0; i < size; i++) { - lcv.vector[i] = (rand.nextInt()); + lcv.vector[i] = (rand.nextInt(maxValue)); } batch.cols[0] = lcv; batch.cols[1] = new LongColumnVector(size); @@ -159,7 +166,7 @@ public void testVectorUDFYear() { batch.cols[0].isNull[0] = true; verifyUDFYear(batch); - batch = getVectorizedRandomRowBatch(200, VectorizedRowBatch.DEFAULT_SIZE); + batch = getVectorizedRandomRowBatch(200, VectorizedRowBatch.DEFAULT_SIZE, MAX_SANE_DATE_VALUE); verifyUDFYear(batch); TestVectorizedRowBatch.addRandomNulls(batch.cols[0]); verifyUDFYear(batch); @@ -283,7 +290,7 @@ public void testVectorUDFMonth() { batch.cols[0].isNull[0] = true; verifyUDFMonth(batch); - batch = getVectorizedRandomRowBatch(200, VectorizedRowBatch.DEFAULT_SIZE); + batch = getVectorizedRandomRowBatch(200, VectorizedRowBatch.DEFAULT_SIZE, MAX_SANE_DATE_VALUE); verifyUDFMonth(batch); TestVectorizedRowBatch.addRandomNulls(batch.cols[0]); verifyUDFMonth(batch);