diff --git a/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorUtils.java b/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorUtils.java index 8a057d1dab..15c07d7418 100644 --- a/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorUtils.java +++ b/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorUtils.java @@ -1117,33 +1117,28 @@ public static Date getDate(Object o, PrimitiveObjectInspector oi) { Date result = null; switch (oi.getPrimitiveCategory()) { case VOID: - result = null; break; case STRING: StringObjectInspector soi = (StringObjectInspector) oi; String s = soi.getPrimitiveJavaObject(o).trim(); - try { + if (s.length() == DATE_LENGTH) { result = Date.valueOf(s); - } catch (IllegalArgumentException e) { + } else { Timestamp ts = getTimestampFromString(s); if (ts != null) { result = Date.ofEpochMilli(ts.toEpochMilli()); - } else { - result = null; } } break; case CHAR: case VARCHAR: { String val = getString(o, oi).trim(); - try { + if (val.length() == DATE_LENGTH) { result = Date.valueOf(val); - } catch (IllegalArgumentException e) { + } else { Timestamp ts = getTimestampFromString(val); if (ts != null) { result = Date.ofEpochMilli(ts.toEpochMilli()); - } else { - result = null; } } break; @@ -1248,26 +1243,38 @@ public static Timestamp getTimestamp(Object o, PrimitiveObjectInspector inputOI, return result; } + private final static int DATE_LENGTH = "YYYY-MM-DD".length(); + private final static int TS_LENGTH = "yyyy-mm-dd hh:mm:ss".length(); + public static Timestamp getTimestampFromString(String s) { - Timestamp result; + Timestamp result = null; s = s.trim(); - s = trimNanoTimestamp(s); + // Handle simpler cases directly avoiding exceptions try { - result = Timestamp.valueOf(s); - } catch (IllegalArgumentException e) { - // Let's try to parse it as timestamp with time zone and transform - try { - result = Timestamp.valueOf(TimestampTZUtil.parse(s).getZonedDateTime() - .toLocalDateTime().toString()); - } catch (DateTimeException e2) { - // Last try: we try to parse it as date and transform + if (s.length() == DATE_LENGTH) { + // Its a date! + return Timestamp.ofEpochMilli(Date.valueOf(s).toEpochMilli()); + } else if (s.length() == TS_LENGTH) { + return Timestamp.valueOf(s); + } + // May have decimal places + s = trimNanoTimestamp(s); + if (s.contains("+")) { + // Timestamp with timezone + // Let's try to parse it as timestamp with time zone and transform try { - result = Timestamp.ofEpochMilli(Date.valueOf(s).toEpochMilli()); - } catch (IllegalArgumentException e3) { - result = null; + result = Timestamp.valueOf(TimestampTZUtil.parse(s).getZonedDateTime() + .toLocalDateTime().toString()); + } catch (DateTimeException e2) { + // Do nothing } + } else { + // Case for timestamp with decimal places + result = Timestamp.valueOf(s); } + } catch (IllegalArgumentException e) { + // Do nothing } return result; }