diff --git a/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFDayOfMonth.java b/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFDayOfMonth.java index 5f12625..8647c4a 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFDayOfMonth.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFDayOfMonth.java @@ -29,6 +29,7 @@ import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorUDFDayOfMonthLong; import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorUDFDayOfMonthString; import org.apache.hadoop.hive.serde2.io.DateWritable; +import org.apache.hadoop.hive.serde2.io.HiveIntervalDayTimeWritable; import org.apache.hadoop.hive.serde2.io.TimestampWritable; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; @@ -98,4 +99,12 @@ public IntWritable evaluate(TimestampWritable t) { return result; } + public IntWritable evaluate(HiveIntervalDayTimeWritable i) { + if (i == null) { + return null; + } + + result.set(i.getHiveIntervalDayTime().getDays()); + return result; + } } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFHour.java b/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFHour.java index 155dc29..af4ed6a 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFHour.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFHour.java @@ -28,6 +28,7 @@ import org.apache.hadoop.hive.ql.exec.vector.VectorizedExpressions; import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorUDFHourLong; import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorUDFHourString; +import org.apache.hadoop.hive.serde2.io.HiveIntervalDayTimeWritable; import org.apache.hadoop.hive.serde2.io.TimestampWritable; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; @@ -95,4 +96,12 @@ public IntWritable evaluate(TimestampWritable t) { return result; } + public IntWritable evaluate(HiveIntervalDayTimeWritable i) { + if (i == null) { + return null; + } + + result.set(i.getHiveIntervalDayTime().getHours()); + return result; + } } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFMinute.java b/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFMinute.java index 5755adb..f778fac 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFMinute.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFMinute.java @@ -28,6 +28,7 @@ import org.apache.hadoop.hive.ql.exec.vector.VectorizedExpressions; import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorUDFMinuteLong; import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorUDFMinuteString; +import org.apache.hadoop.hive.serde2.io.HiveIntervalDayTimeWritable; import org.apache.hadoop.hive.serde2.io.TimestampWritable; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; @@ -95,4 +96,12 @@ public IntWritable evaluate(TimestampWritable t) { return result; } + public IntWritable evaluate(HiveIntervalDayTimeWritable i) { + if (i == null) { + return null; + } + + result.set(i.getHiveIntervalDayTime().getMinutes()); + return result; + } } 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 f37c054..ae034f7 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 @@ -29,6 +29,7 @@ import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorUDFMonthLong; import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorUDFMonthString; import org.apache.hadoop.hive.serde2.io.DateWritable; +import org.apache.hadoop.hive.serde2.io.HiveIntervalYearMonthWritable; import org.apache.hadoop.hive.serde2.io.TimestampWritable; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; @@ -94,4 +95,12 @@ public IntWritable evaluate(TimestampWritable t) { return result; } + public IntWritable evaluate(HiveIntervalYearMonthWritable i) { + if (i == null) { + return null; + } + + result.set(i.getHiveIntervalYearMonth().getMonths()); + return result; + } } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFSecond.java b/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFSecond.java index 0292931..8fb8842 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFSecond.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFSecond.java @@ -23,14 +23,18 @@ import java.util.Calendar; import java.util.Date; +import org.apache.hadoop.hive.common.type.HiveIntervalDayTime; import org.apache.hadoop.hive.ql.exec.Description; import org.apache.hadoop.hive.ql.exec.UDF; import org.apache.hadoop.hive.ql.exec.vector.VectorizedExpressions; import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorUDFSecondLong; import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorUDFSecondString; +import org.apache.hadoop.hive.serde2.io.DoubleWritable; +import org.apache.hadoop.hive.serde2.io.HiveIntervalDayTimeWritable; import org.apache.hadoop.hive.serde2.io.TimestampWritable; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; +import org.apache.hive.common.util.DateUtils; /** * UDFSecond. @@ -52,6 +56,7 @@ private final Calendar calendar = Calendar.getInstance(); private final IntWritable result = new IntWritable(); + private final DoubleWritable doubleResult = new DoubleWritable(); public UDFSecond() { } @@ -96,4 +101,13 @@ public IntWritable evaluate(TimestampWritable t) { return result; } + public DoubleWritable evaluate(HiveIntervalDayTimeWritable i) { + if (i == null) { + return null; + } + + HiveIntervalDayTime idt = i.getHiveIntervalDayTime(); + doubleResult.set(idt.getSeconds() + (((double) idt.getNanos()) / DateUtils.NANOS_PER_SEC)); + return doubleResult; + } } 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 16525c2..a7210c3 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 @@ -29,6 +29,7 @@ import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorUDFYearLong; import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorUDFYearString; import org.apache.hadoop.hive.serde2.io.DateWritable; +import org.apache.hadoop.hive.serde2.io.HiveIntervalYearMonthWritable; import org.apache.hadoop.hive.serde2.io.TimestampWritable; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; @@ -98,4 +99,12 @@ public IntWritable evaluate(TimestampWritable t) { return result; } + public IntWritable evaluate(HiveIntervalYearMonthWritable i) { + if (i == null) { + return null; + } + + result.set(i.getHiveIntervalYearMonth().getYears()); + return result; + } } diff --git a/ql/src/test/queries/clientpositive/interval_udf.q b/ql/src/test/queries/clientpositive/interval_udf.q new file mode 100644 index 0000000..3fbdb0b --- /dev/null +++ b/ql/src/test/queries/clientpositive/interval_udf.q @@ -0,0 +1,8 @@ + +select + year(iym), month(iym), day(idt), hour(idt), minute(idt), second(idt) +from ( + select interval '1-2' year to month iym, interval '3 4:5:6.789' day to second idt + from src limit 1 +) q; + diff --git a/ql/src/test/results/clientpositive/interval_udf.q.out b/ql/src/test/results/clientpositive/interval_udf.q.out new file mode 100644 index 0000000..b8d0e8e --- /dev/null +++ b/ql/src/test/results/clientpositive/interval_udf.q.out @@ -0,0 +1,19 @@ +PREHOOK: query: select + year(iym), month(iym), day(idt), hour(idt), minute(idt), second(idt) +from ( + select interval '1-2' year to month iym, interval '3 4:5:6.789' day to second idt + from src limit 1 +) q +PREHOOK: type: QUERY +PREHOOK: Input: default@src +#### A masked pattern was here #### +POSTHOOK: query: select + year(iym), month(iym), day(idt), hour(idt), minute(idt), second(idt) +from ( + select interval '1-2' year to month iym, interval '3 4:5:6.789' day to second idt + from src limit 1 +) q +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +#### A masked pattern was here #### +1 2 3 4 5 6.789