This is an automated email from the ASF dual-hosted git repository.

kunalkapoor pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/carbondata.git


The following commit(s) were added to refs/heads/master by this push:
     new 41eadda  [CARBONDATA-3963]Fix hive timestamp data mismatch issue and 
empty data during query issue
41eadda is described below

commit 41eadda6cc854ec13cd96822b0aa2b92e222e04d
Author: akashrn5 <[email protected]>
AuthorDate: Wed Aug 26 14:23:58 2020 +0530

    [CARBONDATA-3963]Fix hive timestamp data mismatch issue and empty data 
during query issue
    
    Why is this PR needed?
    1. when carbon table is queried through beeline, gives empty data.
    2. the timestamp data given by carbon table is different than hive table.
    Because during read we used to send the Timestamp value to 
WritableTimestampObjectInspector's
    create method, which basically was converting the value to EpochMillli, 
which resulted in the
    time value go different than the actual input data.
    
    What changes were proposed in this PR?
    1. Pass the carbon storage_handler into the table parameters
    2. Convert the the long value to formatted string and directly form the 
TimestampWritableV2,
    by passing the Hive's Timestamp object which avoid EpochMilli and gives the 
proper data as output.
    
    This closes #3903
---
 .../java/org/apache/carbondata/hive/WritableReadSupport.java | 12 ++++++++----
 .../apache/carbondata/hive/CarbonHiveMetastoreListener.scala |  2 ++
 .../test/java/org/apache/carbondata/hive/HiveTestUtils.java  | 11 +++++++++--
 3 files changed, 19 insertions(+), 6 deletions(-)

diff --git 
a/integration/hive/src/main/java/org/apache/carbondata/hive/WritableReadSupport.java
 
b/integration/hive/src/main/java/org/apache/carbondata/hive/WritableReadSupport.java
index b0d87e7..a404b78 100644
--- 
a/integration/hive/src/main/java/org/apache/carbondata/hive/WritableReadSupport.java
+++ 
b/integration/hive/src/main/java/org/apache/carbondata/hive/WritableReadSupport.java
@@ -18,12 +18,13 @@
 package org.apache.carbondata.hive;
 
 import java.io.IOException;
-import java.sql.Timestamp;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.carbondata.core.constants.CarbonCommonConstants;
 import org.apache.carbondata.core.metadata.datatype.DataType;
 import org.apache.carbondata.core.metadata.datatype.DataTypes;
 import org.apache.carbondata.core.metadata.schema.table.CarbonTable;
@@ -35,7 +36,6 @@ import org.apache.hadoop.hive.common.type.HiveDecimal;
 import org.apache.hadoop.hive.serde2.io.*;
 import org.apache.hadoop.hive.serde2.io.DoubleWritable;
 import org.apache.hadoop.hive.serde2.io.ShortWritable;
-import 
org.apache.hadoop.hive.serde2.objectinspector.primitive.WritableTimestampObjectInspector;
 import org.apache.hadoop.io.ArrayWritable;
 import org.apache.hadoop.io.BooleanWritable;
 import org.apache.hadoop.io.BytesWritable;
@@ -231,8 +231,12 @@ public class WritableReadSupport<T> implements 
CarbonReadSupport<T> {
     } else if (dataType == DataTypes.DATE) {
       return new DateWritableV2((Integer) obj);
     } else if (dataType == DataTypes.TIMESTAMP) {
-      WritableTimestampObjectInspector ins = new 
WritableTimestampObjectInspector();
-      return ins.getPrimitiveWritableObject(ins.create(new Timestamp((long) 
obj / 1000)));
+      SimpleDateFormat dateFormat =
+          new 
SimpleDateFormat(CarbonCommonConstants.CARBON_TIMESTAMP_DEFAULT_FORMAT);
+      String formattedTime = dateFormat.format((long) obj / 1000);
+      org.apache.hadoop.hive.common.type.Timestamp t =
+          org.apache.hadoop.hive.common.type.Timestamp.valueOf(formattedTime);
+      return new TimestampWritableV2(t);
     } else if (dataType == DataTypes.STRING) {
       return new Text(obj.toString());
     } else if (DataTypes.isArrayType(dataType)) {
diff --git 
a/integration/hive/src/main/scala/org/apache/carbondata/hive/CarbonHiveMetastoreListener.scala
 
b/integration/hive/src/main/scala/org/apache/carbondata/hive/CarbonHiveMetastoreListener.scala
index 3f0f4f0..c8e268b 100644
--- 
a/integration/hive/src/main/scala/org/apache/carbondata/hive/CarbonHiveMetastoreListener.scala
+++ 
b/integration/hive/src/main/scala/org/apache/carbondata/hive/CarbonHiveMetastoreListener.scala
@@ -51,6 +51,8 @@ class CarbonHiveMetastoreListener(conf: Configuration) 
extends MetaStorePreEvent
             table.getSd.setCols(hiveSchema)
             
table.getSd.setInputFormat("org.apache.carbondata.hive.MapredCarbonInputFormat")
             
table.getSd.setOutputFormat("org.apache.carbondata.hive.MapredCarbonOutputFormat")
+            table.getParameters
+              .put("storage_handler", 
"org.apache.carbondata.hive.CarbonStorageHandler")
             val serdeInfo = table.getSd.getSerdeInfo
             
serdeInfo.setSerializationLib("org.apache.carbondata.hive.CarbonHiveSerDe")
             val tablePath = serdeInfo.getParameters.get("tablePath")
diff --git 
a/integration/hive/src/test/java/org/apache/carbondata/hive/HiveTestUtils.java 
b/integration/hive/src/test/java/org/apache/carbondata/hive/HiveTestUtils.java
index 67c65a4..44c19b7 100644
--- 
a/integration/hive/src/test/java/org/apache/carbondata/hive/HiveTestUtils.java
+++ 
b/integration/hive/src/test/java/org/apache/carbondata/hive/HiveTestUtils.java
@@ -21,6 +21,9 @@ import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
 
 import org.apache.carbondata.hive.test.server.HiveEmbeddedServer2;
 
@@ -56,6 +59,8 @@ public abstract class HiveTestUtils {
   public boolean checkAnswer(ResultSet actual, ResultSet expected) throws 
SQLException {
     Assert.assertEquals("Row Count Mismatch: ", expected.getFetchSize(), 
actual.getFetchSize());
     int rowCountExpected = 0;
+    List<String> expectedValuesList = new ArrayList<>();
+    List<String> actualValuesList = new ArrayList<>();
     while (expected.next()) {
       rowCountExpected ++;
       if (!actual.next()) {
@@ -65,10 +70,12 @@ public abstract class HiveTestUtils {
       Assert.assertTrue(numOfColumnsExpected > 0);
       Assert.assertEquals(actual.getMetaData().getColumnCount(), 
numOfColumnsExpected);
       for (int i = 1; i <= numOfColumnsExpected; i++) {
-        Assert.assertEquals(actual.getString(i), actual.getString(i));
+        expectedValuesList.add(expected.getString(i));
+        actualValuesList.add(actual.getString(i));
       }
-      System.out.println();
     }
+    Collections.sort(expectedValuesList);Collections.sort(actualValuesList);
+    Assert.assertArrayEquals(expectedValuesList.toArray(), 
actualValuesList.toArray());
     Assert.assertTrue(rowCountExpected > 0);
     return true;
   }

Reply via email to