From 6ecff73ed915bae73fb5a96ec745b84cc5e7d4db Mon Sep 17 00:00:00 2001 From: nareshpr Date: Sun, 12 Jan 2020 19:52:06 +0530 Subject: [PATCH] HIVE-22400 - Hour, Minute, Second UDF returns NULL if HH:mm:ss format data is passed --- .../org/apache/hadoop/hive/common/type/Timestamp.java | 7 +++++++ .../apache/hadoop/hive/common/type/TimestampUtils.java | 9 +++++++-- ql/src/test/results/clientpositive/udf_hour.q.out | 6 +++--- ql/src/test/results/clientpositive/udf_minute.q.out | 8 ++++---- ql/src/test/results/clientpositive/udf_second.q.out | 6 +++--- 5 files changed, 24 insertions(+), 12 deletions(-) diff --git a/common/src/java/org/apache/hadoop/hive/common/type/Timestamp.java b/common/src/java/org/apache/hadoop/hive/common/type/Timestamp.java index a8b7b6d186..f2c1493f56 100644 --- a/common/src/java/org/apache/hadoop/hive/common/type/Timestamp.java +++ b/common/src/java/org/apache/hadoop/hive/common/type/Timestamp.java @@ -18,7 +18,9 @@ package org.apache.hadoop.hive.common.type; import java.time.Instant; +import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.LocalTime; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; @@ -166,6 +168,11 @@ public static Timestamp valueOf(String s) { return new Timestamp(localDateTime); } + public static Timestamp getTimestampFromTime(String s) { + return new Timestamp(LocalDateTime.of(LocalDate.now(), + LocalTime.parse(s, DateTimeFormatter.ISO_LOCAL_TIME))); + } + public static Timestamp ofEpochSecond(long epochSecond) { return ofEpochSecond(epochSecond, 0); } diff --git a/common/src/java/org/apache/hadoop/hive/common/type/TimestampUtils.java b/common/src/java/org/apache/hadoop/hive/common/type/TimestampUtils.java index f26f8ae01e..3cebdcc88f 100644 --- a/common/src/java/org/apache/hadoop/hive/common/type/TimestampUtils.java +++ b/common/src/java/org/apache/hadoop/hive/common/type/TimestampUtils.java @@ -186,8 +186,13 @@ public static Timestamp stringToTimestamp(String s) { return Timestamp.valueOf( TimestampTZUtil.parse(s).getZonedDateTime().toLocalDateTime().toString()); } catch (IllegalArgumentException | DateTimeParseException eTZ) { - // Last attempt - return Timestamp.ofEpochMilli(Date.valueOf(s).toEpochMilli()); + try { + // Try HH:mm:ss format (For Hour, Minute & Second UDF). + return Timestamp.getTimestampFromTime(s); + } catch(DateTimeParseException e) { + // Last attempt + return Timestamp.ofEpochMilli(Date.valueOf(s).toEpochMilli()); + } } } } diff --git a/ql/src/test/results/clientpositive/udf_hour.q.out b/ql/src/test/results/clientpositive/udf_hour.q.out index 01745a0c3a..3eca55dc39 100644 --- a/ql/src/test/results/clientpositive/udf_hour.q.out +++ b/ql/src/test/results/clientpositive/udf_hour.q.out @@ -46,9 +46,9 @@ STAGE PLANS: predicate: (UDFToDouble(key) = 86.0D) (type: boolean) Statistics: Num rows: 250 Data size: 21750 Basic stats: COMPLETE Column stats: COMPLETE Select Operator - expressions: 13 (type: int), null (type: int), 0 (type: int) + expressions: 13 (type: int), 13 (type: int), 0 (type: int) outputColumnNames: _col0, _col1, _col2 - Statistics: Num rows: 250 Data size: 2004 Basic stats: COMPLETE Column stats: COMPLETE + Statistics: Num rows: 250 Data size: 3000 Basic stats: COMPLETE Column stats: COMPLETE ListSink PREHOOK: query: SELECT hour('2009-08-07 13:14:15'), hour('13:14:15'), hour('2009-08-07') @@ -61,7 +61,7 @@ FROM src WHERE key = 86 POSTHOOK: type: QUERY POSTHOOK: Input: default@src #### A masked pattern was here #### -13 NULL 0 +13 13 0 PREHOOK: query: SELECT hour(cast('2009-08-07 13:14:15' as timestamp)) FROM src WHERE key=86 PREHOOK: type: QUERY diff --git a/ql/src/test/results/clientpositive/udf_minute.q.out b/ql/src/test/results/clientpositive/udf_minute.q.out index 094e6c60bc..efb8dc6f7e 100644 --- a/ql/src/test/results/clientpositive/udf_minute.q.out +++ b/ql/src/test/results/clientpositive/udf_minute.q.out @@ -46,12 +46,12 @@ STAGE PLANS: predicate: (UDFToDouble(key) = 86.0D) (type: boolean) Statistics: Num rows: 250 Data size: 21750 Basic stats: COMPLETE Column stats: COMPLETE Select Operator - expressions: 14 (type: int), null (type: int), 0 (type: int) + expressions: 14 (type: int), 14 (type: int), 0 (type: int) outputColumnNames: _col0, _col1, _col2 - Statistics: Num rows: 250 Data size: 2004 Basic stats: COMPLETE Column stats: COMPLETE + Statistics: Num rows: 250 Data size: 3000 Basic stats: COMPLETE Column stats: COMPLETE File Output Operator compressed: false - Statistics: Num rows: 250 Data size: 2004 Basic stats: COMPLETE Column stats: COMPLETE + Statistics: Num rows: 250 Data size: 3000 Basic stats: COMPLETE Column stats: COMPLETE table: input format: org.apache.hadoop.mapred.SequenceFileInputFormat output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat @@ -74,4 +74,4 @@ FROM src WHERE key = 86 POSTHOOK: type: QUERY POSTHOOK: Input: default@src #### A masked pattern was here #### -14 NULL 0 +14 14 0 diff --git a/ql/src/test/results/clientpositive/udf_second.q.out b/ql/src/test/results/clientpositive/udf_second.q.out index 906dfb735d..b60b7af4f6 100644 --- a/ql/src/test/results/clientpositive/udf_second.q.out +++ b/ql/src/test/results/clientpositive/udf_second.q.out @@ -46,9 +46,9 @@ STAGE PLANS: predicate: (UDFToDouble(key) = 86.0D) (type: boolean) Statistics: Num rows: 250 Data size: 21750 Basic stats: COMPLETE Column stats: COMPLETE Select Operator - expressions: 15 (type: int), null (type: int), 0 (type: int) + expressions: 15 (type: int), 15 (type: int), 0 (type: int) outputColumnNames: _col0, _col1, _col2 - Statistics: Num rows: 250 Data size: 2004 Basic stats: COMPLETE Column stats: COMPLETE + Statistics: Num rows: 250 Data size: 3000 Basic stats: COMPLETE Column stats: COMPLETE ListSink PREHOOK: query: SELECT second('2009-08-07 13:14:15'), second('13:14:15'), second('2009-08-07') @@ -61,4 +61,4 @@ FROM src WHERE key = 86 POSTHOOK: type: QUERY POSTHOOK: Input: default@src #### A masked pattern was here #### -15 NULL 0 +15 15 0 -- 2.20.1