diff --git a/accumulo-handler/src/test/org/apache/hadoop/hive/accumulo/mr/TestHiveAccumuloTypes.java b/accumulo-handler/src/test/org/apache/hadoop/hive/accumulo/mr/TestHiveAccumuloTypes.java
index 926f5720ac..3074cc6923 100644
--- a/accumulo-handler/src/test/org/apache/hadoop/hive/accumulo/mr/TestHiveAccumuloTypes.java
+++ b/accumulo-handler/src/test/org/apache/hadoop/hive/accumulo/mr/TestHiveAccumuloTypes.java
@@ -22,8 +22,7 @@
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
-import java.sql.Date;
-import java.sql.Timestamp;
+import java.time.LocalDateTime;
import java.util.Map.Entry;
import org.apache.accumulo.core.client.BatchWriter;
@@ -39,12 +38,14 @@
import org.apache.hadoop.hive.accumulo.AccumuloHiveConstants;
import org.apache.hadoop.hive.accumulo.AccumuloHiveRow;
import org.apache.hadoop.hive.accumulo.serde.AccumuloSerDeParameters;
+import org.apache.hadoop.hive.common.type.Date;
import org.apache.hadoop.hive.common.type.HiveChar;
import org.apache.hadoop.hive.common.type.HiveDecimal;
import org.apache.hadoop.hive.common.type.HiveVarchar;
+import org.apache.hadoop.hive.common.type.Timestamp;
import org.apache.hadoop.hive.serde.serdeConstants;
import org.apache.hadoop.hive.serde2.ByteStream;
-import org.apache.hadoop.hive.serde2.io.DateWritable;
+import org.apache.hadoop.hive.serde2.io.DateWritableV2;
import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
import org.apache.hadoop.hive.serde2.io.TimestampWritable;
import org.apache.hadoop.hive.serde2.lazy.ByteArrayRef;
@@ -234,17 +235,17 @@ public void testBinaryTypes() throws Exception {
// date
baos.reset();
- Date now = new Date(System.currentTimeMillis());
- DateWritable dateWritable = new DateWritable(now);
+ Date now = Date.ofEpochMilli(System.currentTimeMillis());
+ DateWritableV2 dateWritable = new DateWritableV2(now);
Date dateValue = dateWritable.get();
dateWritable.write(out);
m.put(cfBytes, "date".getBytes(), baos.toByteArray());
// tiemestamp
baos.reset();
- Timestamp timestampValue = new Timestamp(now.getTime());
+ Timestamp timestampValue = new Timestamp(LocalDateTime.now());
ByteStream.Output output = new ByteStream.Output();
- TimestampWritable timestampWritable = new TimestampWritable(new Timestamp(now.getTime()));
+ TimestampWritable timestampWritable = new TimestampWritable(new Timestamp(LocalDateTime.now()));
timestampWritable.write(new DataOutputStream(output));
output.close();
m.put(cfBytes, "timestamp".getBytes(), output.toByteArray());
@@ -587,8 +588,8 @@ public void testUtf8Types() throws Exception {
m.put(cfBytes, "decimal".getBytes(), baos.toByteArray());
// date
- Date now = new Date(System.currentTimeMillis());
- DateWritable dateWritable = new DateWritable(now);
+ Date now = Date.ofEpochMilli(System.currentTimeMillis());
+ DateWritableV2 dateWritable = new DateWritableV2(now);
Date dateValue = dateWritable.get();
baos.reset();
JavaDateObjectInspector dateOI = (JavaDateObjectInspector) PrimitiveObjectInspectorFactory
@@ -598,7 +599,7 @@ public void testUtf8Types() throws Exception {
m.put(cfBytes, "date".getBytes(), baos.toByteArray());
// timestamp
- Timestamp timestampValue = new Timestamp(now.getTime());
+ Timestamp timestampValue = new Timestamp(LocalDateTime.now());
baos.reset();
JavaTimestampObjectInspector timestampOI = (JavaTimestampObjectInspector) PrimitiveObjectInspectorFactory
.getPrimitiveJavaObjectInspector(TypeInfoFactory
diff --git a/common/src/java/org/apache/hadoop/hive/common/type/Date.java b/common/src/java/org/apache/hadoop/hive/common/type/Date.java
new file mode 100644
index 0000000000..5d666e5d5a
--- /dev/null
+++ b/common/src/java/org/apache/hadoop/hive/common/type/Date.java
@@ -0,0 +1,176 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hive.common.type;
+
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeFormatterBuilder;
+import java.time.format.DateTimeParseException;
+import java.time.format.SignStyle;
+
+import static java.time.temporal.ChronoField.DAY_OF_MONTH;
+import static java.time.temporal.ChronoField.MONTH_OF_YEAR;
+import static java.time.temporal.ChronoField.YEAR;
+
+/**
+ * This is the internal type for Date.
+ * The full qualified input format of Date is "yyyy-MM-dd".
+ */
+public class Date implements Comparable {
+
+ private static final LocalDate EPOCH = LocalDate.of(1970, 1, 1);
+ private static final DateTimeFormatter PARSE_FORMATTER;
+ private static final DateTimeFormatter PRINT_FORMATTER;
+ static {
+ DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
+ builder.appendValue(YEAR, 1, 10, SignStyle.NORMAL)
+ .appendLiteral('-')
+ .appendValue(MONTH_OF_YEAR, 1, 2, SignStyle.NORMAL)
+ .appendLiteral('-')
+ .appendValue(DAY_OF_MONTH, 1, 2, SignStyle.NORMAL);
+ PARSE_FORMATTER = builder.toFormatter();
+ builder = new DateTimeFormatterBuilder();
+ builder.append(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+ PRINT_FORMATTER = builder.toFormatter();
+ }
+
+ private LocalDate localDate;
+
+ public Date() {
+ this(EPOCH);
+ }
+
+ public Date(LocalDate localDate) {
+ setLocalDate(localDate);
+ }
+
+ public LocalDate getLocalDate() {
+ return localDate;
+ }
+
+ public void setLocalDate(LocalDate localDate) {
+ this.localDate = localDate != null ? localDate : EPOCH;
+ }
+
+ @Override
+ public String toString() {
+ return localDate.format(PRINT_FORMATTER);
+ }
+
+ public int hashCode() {
+ return localDate.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (other instanceof Date) {
+ return compareTo((Date) other) == 0;
+ }
+ return false;
+ }
+
+ @Override
+ public int compareTo(Date o) {
+ return localDate.compareTo(o.localDate);
+ }
+
+ public int toEpochDay() {
+ return (int) localDate.toEpochDay();
+ }
+
+ public long toEpochSecond() {
+ return localDate.atStartOfDay().toEpochSecond(ZoneOffset.UTC);
+ }
+
+ public long toEpochMilli() {
+ return localDate.atStartOfDay().toInstant(ZoneOffset.UTC).toEpochMilli();
+ }
+
+ public void setYear(int year) {
+ localDate = localDate.withYear(year);
+ }
+
+ public void setMonth(int month) {
+ localDate = localDate.withMonth(month);
+ }
+
+ public void setDayOfMonth(int dayOfMonth) {
+ localDate = localDate.withDayOfMonth(dayOfMonth);
+ }
+
+ public void setTimeInDays(int epochDay) {
+ localDate = LocalDate.ofEpochDay(epochDay);
+ }
+
+ public void setTimeInMillis(long epochMilli) {
+ localDate = LocalDateTime.ofInstant(
+ Instant.ofEpochMilli(epochMilli), ZoneOffset.UTC).toLocalDate();
+ }
+
+ public static Date valueOf(String s) {
+ // Trim anything after date
+ int idx = s.indexOf(" ");
+ if (idx != -1) {
+ s = s.substring(0, idx);
+ }
+ LocalDate localDate;
+ try {
+ localDate = LocalDate.parse(s, PARSE_FORMATTER);
+ } catch (DateTimeParseException e) {
+ throw new IllegalArgumentException("Cannot create date, parsing error");
+ }
+ return new Date(localDate);
+ }
+
+ public static Date ofEpochDay(int epochDay) {
+ return new Date(LocalDate.ofEpochDay(epochDay));
+ }
+
+ public static Date ofEpochMilli(long epochMilli) {
+ return new Date(LocalDateTime.ofInstant(
+ Instant.ofEpochMilli(epochMilli), ZoneOffset.UTC).toLocalDate());
+ }
+
+ public static Date of(int year, int month, int dayOfMonth) {
+ return new Date(LocalDate.of(year, month, dayOfMonth));
+ }
+
+ public int getYear() {
+ return localDate.getYear();
+ }
+
+ public int getMonth() {
+ return localDate.getMonthValue();
+ }
+
+ public int getDay() {
+ return localDate.getDayOfMonth();
+ }
+
+ /**
+ * Return a copy of this object.
+ */
+ public Object clone() {
+ // LocalDateTime is immutable.
+ return new Date(this.localDate);
+ }
+
+}
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
new file mode 100644
index 0000000000..30c2ea06cd
--- /dev/null
+++ b/common/src/java/org/apache/hadoop/hive/common/type/Timestamp.java
@@ -0,0 +1,220 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hive.common.type;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeFormatterBuilder;
+import java.time.format.DateTimeParseException;
+import java.time.format.SignStyle;
+import java.time.temporal.ChronoField;
+
+import static java.time.temporal.ChronoField.DAY_OF_MONTH;
+import static java.time.temporal.ChronoField.MONTH_OF_YEAR;
+import static java.time.temporal.ChronoField.YEAR;
+
+/**
+ * This is the internal type for Timestamp.
+ * The full qualified input format of Timestamp is
+ * "yyyy-MM-dd HH:mm:ss[.SSS...]", where the time part is optional.
+ * If time part is absent, a default '00:00:00.0' will be used.
+ */
+public class Timestamp implements Comparable {
+
+ private static final LocalDateTime EPOCH = LocalDateTime.of(1970, 1, 1, 0, 0, 0);
+ private static final DateTimeFormatter PARSE_FORMATTER;
+ private static final DateTimeFormatter PRINT_FORMATTER;
+
+ static {
+ DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
+ // Date part
+ builder.appendValue(YEAR, 1, 10, SignStyle.NORMAL)
+ .appendLiteral('-')
+ .appendValue(MONTH_OF_YEAR, 1, 2, SignStyle.NORMAL)
+ .appendLiteral('-')
+ .appendValue(DAY_OF_MONTH, 1, 2, SignStyle.NORMAL);
+ // Time part
+ builder
+ .optionalStart()
+ .appendLiteral(" ").append(DateTimeFormatter.ofPattern("HH:mm:ss"))
+ .optionalStart().appendFraction(ChronoField.NANO_OF_SECOND, 1, 9, true).optionalEnd()
+ .optionalEnd();
+ PARSE_FORMATTER = builder.toFormatter();
+ builder = new DateTimeFormatterBuilder();
+ // Date and time parts
+ builder.append(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+ // Fractional part
+ builder.optionalStart().appendFraction(ChronoField.NANO_OF_SECOND, 0, 9, true).optionalEnd();
+ PRINT_FORMATTER = builder.toFormatter();
+ }
+
+ private LocalDateTime localDateTime;
+
+ public Timestamp() {
+ this(EPOCH);
+ }
+
+ public Timestamp(LocalDateTime localDateTime) {
+ setLocalDateTime(localDateTime);
+ }
+
+ public LocalDateTime getLocalDateTime() {
+ return localDateTime;
+ }
+
+ public void setLocalDateTime(LocalDateTime localDateTime) {
+ this.localDateTime = localDateTime != null ? localDateTime : EPOCH;
+ }
+
+ @Override
+ public String toString() {
+ return localDateTime.format(PRINT_FORMATTER);
+ }
+
+ public int hashCode() {
+ return localDateTime.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (other instanceof Timestamp) {
+ return compareTo((Timestamp) other) == 0;
+ }
+ return false;
+ }
+
+ @Override
+ public int compareTo(Timestamp o) {
+ return localDateTime.compareTo(o.localDateTime);
+ }
+
+ public long toEpochSecond() {
+ return localDateTime.toEpochSecond(ZoneOffset.UTC);
+ }
+
+ public void setTimeInSeconds(long epochSecond) {
+ setTimeInSeconds(epochSecond, 0);
+ }
+
+ public void setTimeInSeconds(long epochSecond, int nanos) {
+ localDateTime = LocalDateTime.ofEpochSecond(
+ epochSecond, nanos, ZoneOffset.UTC);
+ }
+
+ public long toEpochMilli() {
+ return localDateTime.toInstant(ZoneOffset.UTC).toEpochMilli();
+ }
+
+ public void setTimeInMillis(long epochMilli) {
+ localDateTime = LocalDateTime.ofInstant(
+ Instant.ofEpochMilli(epochMilli), ZoneOffset.UTC);
+ }
+
+ public void setTimeInMillis(long epochMilli, int nanos) {
+ localDateTime = LocalDateTime
+ .ofInstant(Instant.ofEpochMilli(epochMilli), ZoneOffset.UTC)
+ .withNano(nanos);
+ }
+
+ public int getNanos() {
+ return localDateTime.getNano();
+ }
+
+ public static Timestamp valueOf(String s) {
+ LocalDateTime localDateTime;
+ try {
+ localDateTime = LocalDateTime.parse(s, PARSE_FORMATTER);
+ } catch (DateTimeParseException e) {
+ // Try ISO-8601 format
+ try {
+ localDateTime = LocalDateTime.parse(s);
+ } catch (DateTimeParseException e2) {
+ throw new IllegalArgumentException("Cannot create timestamp, parsing error");
+ }
+ }
+ return new Timestamp(localDateTime);
+ }
+
+ public static Timestamp ofEpochSecond(long epochSecond) {
+ return ofEpochSecond(epochSecond, 0);
+ }
+
+ public static Timestamp ofEpochSecond(long epochSecond, int nanos) {
+ return new Timestamp(
+ LocalDateTime.ofEpochSecond(epochSecond, nanos, ZoneOffset.UTC));
+ }
+
+ public static Timestamp ofEpochMilli(long epochMilli) {
+ return new Timestamp(LocalDateTime
+ .ofInstant(Instant.ofEpochMilli(epochMilli), ZoneOffset.UTC));
+ }
+
+ public static Timestamp ofEpochMilli(long epochMilli, int nanos) {
+ return new Timestamp(LocalDateTime
+ .ofInstant(Instant.ofEpochMilli(epochMilli), ZoneOffset.UTC)
+ .withNano(nanos));
+ }
+
+ public void setNanos(int nanos) {
+ localDateTime = localDateTime.withNano(nanos);
+ }
+
+ public int getYear() {
+ return localDateTime.getYear();
+ }
+
+ public int getMonth() {
+ return localDateTime.getMonthValue();
+ }
+
+ public int getDay() {
+ return localDateTime.getDayOfMonth();
+ }
+
+ public int getHours() {
+ return localDateTime.getHour();
+ }
+
+ public int getMinutes() {
+ return localDateTime.getMinute();
+ }
+
+ public int getSeconds() {
+ return localDateTime.getSecond();
+ }
+
+ /**
+ * Return a copy of this object.
+ */
+ public Object clone() {
+ // LocalDateTime is immutable.
+ return new Timestamp(this.localDateTime);
+ }
+
+ public java.sql.Timestamp toSqlTimestamp() {
+ java.sql.Timestamp ts = new java.sql.Timestamp(toEpochMilli());
+ ts.setNanos(getNanos());
+ return ts;
+ }
+
+}
diff --git a/common/src/java/org/apache/hadoop/hive/common/type/TimestampTZUtil.java b/common/src/java/org/apache/hadoop/hive/common/type/TimestampTZUtil.java
index 90ffddba0d..213650c2a5 100644
--- a/common/src/java/org/apache/hadoop/hive/common/type/TimestampTZUtil.java
+++ b/common/src/java/org/apache/hadoop/hive/common/type/TimestampTZUtil.java
@@ -17,7 +17,6 @@
*/
package org.apache.hadoop.hive.common.type;
-import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.DateTimeException;
@@ -31,7 +30,6 @@
import java.time.format.TextStyle;
import java.time.temporal.ChronoField;
import java.time.temporal.TemporalAccessor;
-import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -45,9 +43,6 @@
private static final LocalTime DEFAULT_LOCAL_TIME = LocalTime.of(0, 0);
private static final Pattern SINGLE_DIGIT_PATTERN = Pattern.compile("[\\+-]\\d:\\d\\d");
- private static final ThreadLocal CONVERT_FORMATTER =
- ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
-
static final DateTimeFormatter FORMATTER;
static {
DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
@@ -126,11 +121,14 @@ public static TimestampTZ parseOrNull(String s, ZoneId defaultTimeZone) {
}
}
- // Converts Date to TimestampTZ. The conversion is done text-wise since
- // Date/Timestamp should be treated as description of date/time.
+ // Converts Date to TimestampTZ.
public static TimestampTZ convert(Date date, ZoneId defaultTimeZone) {
- String s = date instanceof Timestamp ? date.toString() : CONVERT_FORMATTER.get().format(date);
- return parse(s, defaultTimeZone);
+ return parse(date.toString(), defaultTimeZone);
+ }
+
+ // Converts Timestamp to TimestampTZ.
+ public static TimestampTZ convert(Timestamp ts, ZoneId defaultTimeZone) {
+ return parse(ts.toString(), defaultTimeZone);
}
public static ZoneId parseTimeZone(String timeZoneStr) {
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
new file mode 100644
index 0000000000..e4179dea3e
--- /dev/null
+++ b/common/src/java/org/apache/hadoop/hive/common/type/TimestampUtils.java
@@ -0,0 +1,167 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hive.common.type;
+
+import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
+
+import java.math.BigDecimal;
+import java.time.DateTimeException;
+
+/**
+ * Utilities for Timestamps and the relevant conversions.
+ */
+public class TimestampUtils {
+ public static final BigDecimal BILLION_BIG_DECIMAL = BigDecimal.valueOf(1000000000);
+
+ /**
+ * Convert the timestamp to a double measured in seconds.
+ * @return double representation of the timestamp, accurate to nanoseconds
+ */
+ public static double getDouble(Timestamp ts) {
+ long seconds = ts.toEpochSecond();
+ return seconds + ((double) ts.getNanos()) / 1000000000;
+ }
+
+ public static Timestamp doubleToTimestamp(double f) {
+ try {
+ long seconds = (long) f;
+
+ // We must ensure the exactness of the double's fractional portion.
+ // 0.6 as the fraction part will be converted to 0.59999... and
+ // significantly reduce the savings from binary serialization
+ BigDecimal bd = new BigDecimal(String.valueOf(f));
+
+ bd = bd.subtract(new BigDecimal(seconds)).multiply(new BigDecimal(1000000000));
+ int nanos = bd.intValue();
+
+ // Convert to millis
+ long millis = seconds * 1000;
+ if (nanos < 0) {
+ millis -= 1000;
+ nanos += 1000000000;
+ }
+
+ return Timestamp.ofEpochMilli(millis, nanos);
+ } catch (IllegalArgumentException | DateTimeException nfe) {
+ return null;
+ }
+ }
+
+ /**
+ * Take a HiveDecimal and return the timestamp representation where the fraction part is the
+ * nanoseconds and integer part is the number of seconds.
+ * @param dec
+ * @return
+ */
+ public static Timestamp decimalToTimestamp(HiveDecimal dec) {
+
+ HiveDecimalWritable nanosWritable = new HiveDecimalWritable(dec);
+ nanosWritable.mutateFractionPortion(); // Clip off seconds portion.
+ nanosWritable.mutateScaleByPowerOfTen(9); // Bring nanoseconds into integer portion.
+ if (!nanosWritable.isSet() || !nanosWritable.isInt()) {
+ return null;
+ }
+ int nanos = nanosWritable.intValue();
+ if (nanos < 0) {
+ nanos += 1000000000;
+ }
+ nanosWritable.setFromLong(nanos);
+
+ HiveDecimalWritable nanoInstant = new HiveDecimalWritable(dec);
+ nanoInstant.mutateScaleByPowerOfTen(9);
+
+ nanoInstant.mutateSubtract(nanosWritable);
+ nanoInstant.mutateScaleByPowerOfTen(-9); // Back to seconds.
+ if (!nanoInstant.isSet() || !nanoInstant.isLong()) {
+ return null;
+ }
+ long seconds = nanoInstant.longValue();
+ return Timestamp.ofEpochSecond(seconds, nanos);
+ }
+
+ /**
+ * Take a HiveDecimalWritable and return the timestamp representation where the fraction part
+ * is the nanoseconds and integer part is the number of seconds.
+ *
+ * This is a HiveDecimalWritable variation with supplied scratch objects.
+ * @param decWritable
+ * @param scratchDecWritable1
+ * @param scratchDecWritable2
+ * @return
+ */
+ public static Timestamp decimalToTimestamp(
+ HiveDecimalWritable decWritable,
+ HiveDecimalWritable scratchDecWritable1, HiveDecimalWritable scratchDecWritable2) {
+
+ HiveDecimalWritable nanosWritable = scratchDecWritable1;
+ nanosWritable.set(decWritable);
+ nanosWritable.mutateFractionPortion(); // Clip off seconds portion.
+ nanosWritable.mutateScaleByPowerOfTen(9); // Bring nanoseconds into integer portion.
+ if (!nanosWritable.isSet() || !nanosWritable.isInt()) {
+ return null;
+ }
+ int nanos = nanosWritable.intValue();
+ if (nanos < 0) {
+ nanos += 1000000000;
+ }
+ nanosWritable.setFromLong(nanos);
+
+ HiveDecimalWritable nanoInstant = scratchDecWritable2;
+ nanoInstant.set(decWritable);
+ nanoInstant.mutateScaleByPowerOfTen(9);
+
+ nanoInstant.mutateSubtract(nanosWritable);
+ nanoInstant.mutateScaleByPowerOfTen(-9); // Back to seconds.
+ if (!nanoInstant.isSet() || !nanoInstant.isLong()) {
+ return null;
+ }
+ long seconds = nanoInstant.longValue();
+
+ return Timestamp.ofEpochSecond(seconds, nanos);
+ }
+
+ public static Timestamp decimalToTimestamp(HiveDecimalV1 dec) {
+ try {
+ BigDecimal nanoInstant = dec.bigDecimalValue().multiply(BILLION_BIG_DECIMAL);
+ int nanos = nanoInstant.remainder(BILLION_BIG_DECIMAL).intValue();
+ if (nanos < 0) {
+ nanos += 1000000000;
+ }
+ long seconds =
+ nanoInstant.subtract(new BigDecimal(nanos)).divide(BILLION_BIG_DECIMAL).longValue();
+
+ return Timestamp.ofEpochSecond(seconds, nanos);
+ } catch (IllegalArgumentException | DateTimeException nfe) {
+ return null;
+ }
+ }
+
+ /**
+ * Rounds the number of milliseconds relative to the epoch down to the nearest whole number of
+ * seconds. 500 would round to 0, -500 would round to -1.
+ */
+ public static long millisToSeconds(long millis) {
+ if (millis >= 0) {
+ return millis / 1000;
+ } else {
+ return (millis - 999) / 1000;
+ }
+ }
+
+}
diff --git a/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java b/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java
index 3295d1dbc5..f3e373e86b 100644
--- a/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java
+++ b/common/src/java/org/apache/hadoop/hive/conf/HiveConf.java
@@ -1881,7 +1881,7 @@ private static void populateLlapDaemonVarsSet(Set llapDaemonVarsSetLocal
"Maximum fraction of heap that can be used by Parquet file writers in one task.\n" +
"It is for avoiding OutOfMemory error in tasks. Work with Parquet 1.6.0 and above.\n" +
"This config parameter is defined in Parquet, so that it does not start with 'hive.'."),
- HIVE_PARQUET_TIMESTAMP_SKIP_CONVERSION("hive.parquet.timestamp.skip.conversion", true,
+ HIVE_PARQUET_TIMESTAMP_SKIP_CONVERSION("hive.parquet.timestamp.skip.conversion", false,
"Current Hive implementation of parquet stores timestamps to UTC, this flag allows skipping of the conversion" +
"on reading parquet files from other tools"),
HIVE_INT_TIMESTAMP_CONVERSION_IN_SECONDS("hive.int.timestamp.conversion.in.seconds", false,
diff --git a/common/src/java/org/apache/hive/common/util/DateParser.java b/common/src/java/org/apache/hive/common/util/DateParser.java
index 949fdbafcf..5db14f1906 100644
--- a/common/src/java/org/apache/hive/common/util/DateParser.java
+++ b/common/src/java/org/apache/hive/common/util/DateParser.java
@@ -17,24 +17,18 @@
*/
package org.apache.hive.common.util;
-import java.sql.Date;
-import java.text.ParsePosition;
-import java.text.SimpleDateFormat;
+import org.apache.hadoop.hive.common.type.Date;
/**
* Date parser class for Hive.
*/
public class DateParser {
- private final SimpleDateFormat formatter;
- private final ParsePosition pos;
+
public DateParser() {
- formatter = new SimpleDateFormat("yyyy-MM-dd");
- // TODO: ideally, we should set formatter.setLenient(false);
- pos = new ParsePosition(0);
- }
+ }
public Date parseDate(String strValue) {
- Date result = new Date(0);
+ Date result = new Date();
if (parseDate(strValue, result)) {
return result;
}
@@ -42,12 +36,16 @@ public Date parseDate(String strValue) {
}
public boolean parseDate(String strValue, Date result) {
- pos.setIndex(0);
- java.util.Date parsedVal = formatter.parse(strValue, pos);
+ Date parsedVal;
+ try {
+ parsedVal = Date.valueOf(strValue);
+ } catch (IllegalArgumentException e) {
+ parsedVal = null;
+ }
if (parsedVal == null) {
return false;
}
- result.setTime(parsedVal.getTime());
+ result.setTimeInMillis(parsedVal.toEpochMilli());
return true;
}
}
diff --git a/common/src/java/org/apache/hive/common/util/TimestampParser.java b/common/src/java/org/apache/hive/common/util/TimestampParser.java
index f674b5d30b..d30ab88892 100644
--- a/common/src/java/org/apache/hive/common/util/TimestampParser.java
+++ b/common/src/java/org/apache/hive/common/util/TimestampParser.java
@@ -18,19 +18,18 @@
package org.apache.hive.common.util;
-import java.math.BigDecimal;
-import java.sql.Timestamp;
import java.util.Arrays;
-import java.util.Iterator;
import java.util.List;
import java.util.Optional;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import org.apache.hadoop.hive.common.type.Timestamp;
import org.joda.time.DateTime;
-import org.joda.time.IllegalInstantException;
+import org.joda.time.LocalDateTime;
import org.joda.time.MutableDateTime;
import org.joda.time.DateTimeFieldType;
+import org.joda.time.chrono.ISOChronology;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.joda.time.format.DateTimeFormatterBuilder;
@@ -52,19 +51,8 @@
protected final static String[] stringArray = new String[] {};
protected final static String millisFormatString = "millis";
- @Nullable
- private final static DateTime startingDateValue = makeStartingDateValue();
-
- @Nullable
- private static DateTime makeStartingDateValue() {
- try {
- return new DateTime(1970, 1, 1, 0, 0, 0, 0);
- } catch (IllegalInstantException e) {
- // 1970-01-01 00:00:00 did not exist in some zones. In these zones, we need to take different,
- // less optimal parsing route.
- return null;
- }
- }
+ protected final static DateTime startingDateValue =
+ new DateTime(1970, 1, 1, 0, 0, 0, 0, ISOChronology.getInstanceUTC());
protected String[] formatStrings = null;
protected DateTimeFormatter fmt = null;
@@ -126,21 +114,24 @@ public Timestamp parseTimestamp(String strValue) throws IllegalArgumentException
if (startingDateValue != null) {
// reset value in case any date fields are missing from the date pattern
- MutableDateTime mdt = new MutableDateTime(startingDateValue);
+ MutableDateTime mdt = new MutableDateTime(
+ startingDateValue, ISOChronology.getInstanceUTC());
// Using parseInto() avoids throwing exception when parsing,
// allowing fallback to default timestamp parsing if custom patterns fail.
int ret = fmt.parseInto(mdt, strValue, 0);
// Only accept parse results if we parsed the entire string
if (ret == strValue.length()) {
- return Optional.of(new Timestamp(mdt.getMillis()));
+ return Optional.of(Timestamp.ofEpochMilli(mdt.getMillis()));
}
return Optional.empty();
}
try {
- DateTime dt = fmt.parseDateTime(strValue);
- return Optional.of(new Timestamp(dt.getMillis()));
+ LocalDateTime dt = fmt.parseLocalDateTime(strValue);
+ return Optional.of(
+ Timestamp.ofEpochMilli(
+ dt.toDateTime(ISOChronology.getInstanceUTC().getZone()).getMillis()));
} catch (IllegalArgumentException e) {
return Optional.empty();
}
@@ -181,7 +172,8 @@ public int parseInto(DateTimeParserBucket bucket, String text, int position) {
// Joda DateTime only has precision to millis, cut off any fractional portion
long millis = Long.parseLong(matcher.group(1));
- DateTime dt = new DateTime(millis);
+ DateTime dt =
+ new DateTime(millis, ISOChronology.getInstanceUTC());
for (DateTimeFieldType field : dateTimeFields) {
bucket.saveField(field, dt.get(field));
}
diff --git a/common/src/test/org/apache/hadoop/hive/common/type/TestHiveDecimalOrcSerializationUtils.java b/common/src/test/org/apache/hadoop/hive/common/type/TestHiveDecimalOrcSerializationUtils.java
index 72dce4deaa..1435339956 100644
--- a/common/src/test/org/apache/hadoop/hive/common/type/TestHiveDecimalOrcSerializationUtils.java
+++ b/common/src/test/org/apache/hadoop/hive/common/type/TestHiveDecimalOrcSerializationUtils.java
@@ -17,26 +17,18 @@
*/
package org.apache.hadoop.hive.common.type;
-import java.sql.Timestamp;
import java.util.Random;
-import java.util.Arrays;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.BigInteger;
-import org.apache.hadoop.hive.serde2.io.HiveDecimalWritableV1;
-import org.apache.hadoop.hive.serde2.io.HiveDecimalWritable;
import org.apache.orc.impl.SerializationUtils;
import org.apache.hadoop.hive.common.type.RandomTypeUtil;
import org.apache.hadoop.hive.ql.exec.vector.expressions.StringExpr;
-import org.apache.hadoop.hive.ql.util.TimestampUtils;
import com.google.code.tempusfugit.concurrency.annotations.*;
-import com.google.code.tempusfugit.concurrency.*;
import org.junit.*;
diff --git a/common/src/test/org/apache/hadoop/hive/common/type/TestTimestampTZ.java b/common/src/test/org/apache/hadoop/hive/common/type/TestTimestampTZ.java
index 5a3f0481bc..cd23abebfa 100644
--- a/common/src/test/org/apache/hadoop/hive/common/type/TestTimestampTZ.java
+++ b/common/src/test/org/apache/hadoop/hive/common/type/TestTimestampTZ.java
@@ -21,7 +21,6 @@
import org.junit.Assert;
import org.junit.Test;
-import java.sql.Timestamp;
import java.time.ZoneId;
import java.time.format.DateTimeParseException;
import java.util.TimeZone;
diff --git a/common/src/test/org/apache/hive/common/util/TestDateParser.java b/common/src/test/org/apache/hive/common/util/TestDateParser.java
index 0553b3d387..3a3585124c 100644
--- a/common/src/test/org/apache/hive/common/util/TestDateParser.java
+++ b/common/src/test/org/apache/hive/common/util/TestDateParser.java
@@ -18,13 +18,13 @@
package org.apache.hive.common.util;
import static org.junit.Assert.*;
-import org.junit.Test;
-import java.sql.Date;
+import org.apache.hadoop.hive.common.type.Date;
+import org.junit.Test;
public class TestDateParser {
DateParser parser = new DateParser();
- Date date = new Date(0);
+ Date date = new Date();
void checkValidCase(String strValue, Date expected) {
Date dateValue = parser.parseDate(strValue);
diff --git a/common/src/test/org/apache/hive/common/util/TestTimestampParser.java b/common/src/test/org/apache/hive/common/util/TestTimestampParser.java
index c982af65c6..3cc474f82b 100644
--- a/common/src/test/org/apache/hive/common/util/TestTimestampParser.java
+++ b/common/src/test/org/apache/hive/common/util/TestTimestampParser.java
@@ -18,11 +18,10 @@
package org.apache.hive.common.util;
-import java.sql.Timestamp;
-import java.util.Arrays;
-import java.util.List;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
-import static org.junit.Assert.*;
+import org.apache.hadoop.hive.common.type.Timestamp;
import org.junit.Test;
public class TestTimestampParser {
@@ -133,10 +132,10 @@ public void testMillisParser() {
TimestampParser tp = new TimestampParser(patterns);
ValidTimestampCase[] validCases = {
- new ValidTimestampCase("0", new Timestamp(0)),
- new ValidTimestampCase("-1000000", new Timestamp(-1000000)),
- new ValidTimestampCase("1420509274123", new Timestamp(1420509274123L)),
- new ValidTimestampCase("1420509274123.456789", new Timestamp(1420509274123L)),
+ new ValidTimestampCase("0", Timestamp.ofEpochMilli(0)),
+ new ValidTimestampCase("-1000000", Timestamp.ofEpochMilli(-1000000)),
+ new ValidTimestampCase("1420509274123", Timestamp.ofEpochMilli(1420509274123L)),
+ new ValidTimestampCase("1420509274123.456789", Timestamp.ofEpochMilli(1420509274123L)),
// Other format pattern should also work
new ValidTimestampCase("1945-12-31T23:59:59",
diff --git a/data/files/alltypesorc3xcols b/data/files/alltypesorc3xcols
index e48487328bcac6872ce7cc652b5abed2529d538b..4d1a98aaede9f2d61b39e1cb930a51d5abba911b 100644
GIT binary patch
delta 717596
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