HIVE-20007 seems to have inadvertently changed the bucket hash code computation via ObjectInspectorUtils.getBucketHashCodeOld() for the DATE and TIMESTAMP data type2.
DATE was previously computed using DateWritable, which uses daysSinceEpoch as the hash code. It is now computed using DateWritableV2, which uses the hash code of java.time.LocalDate (which is not days since epoch).
TIMESTAMP was previous computed using TimestampWritable and now uses TimestampWritableV2. They ostensibly use the same hash code computation, but there are two important differences:
- TimestampWritable rounds the number of milliseconds into the seconds portion of the computation, but TimestampWritableV2 does not.
- TimestampWritable gets the epoch time from java.sql.Timestamp, which returns it relative to the JVM time zone, not UTC. TimestampWritableV2 uses a LocalDateTime relative to UTC.
I was unable to get Hive 3.1 running in order to verify if this actually causes data to be read or written incorrectly (there may be code above this library method which makes things work correctly). However, if my understanding is correct, this means Hive 3.1 is both forwards and backwards incompatible with bucketed tables using either of these data types. It also indicates that Hive needs tests to verify that the hash code does not change between releases.