diff --git a/data/files/tsformat2.json b/data/files/tsformat2.json new file mode 100644 index 0000000000..50fabce594 --- /dev/null +++ b/data/files/tsformat2.json @@ -0,0 +1,2 @@ +{"c1": 123, "c2": "abc", "c3": "02/03/2001 12:34:56"} +{"c1": 456, "c2": "xyz", "c3": "04/18/1906 05:12:00"} diff --git a/ql/src/test/queries/clientpositive/json_serde_tsformat2.q b/ql/src/test/queries/clientpositive/json_serde_tsformat2.q new file mode 100644 index 0000000000..05ab912144 --- /dev/null +++ b/ql/src/test/queries/clientpositive/json_serde_tsformat2.q @@ -0,0 +1,21 @@ + +add jar ${system:maven.local.repository}/org/apache/hive/hcatalog/hive-hcatalog-core/${system:hive.version}/hive-hcatalog-core-${system:hive.version}.jar; + +-- JsonSerDe from hcat lib +CREATE TABLE json_serde_tsformat2_1 (c1 int, c2 string, c3 timestamp) +ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' +WITH SERDEPROPERTIES ('timestamp.formats'='MM/dd/yyyy HH:mm:ss') +; +LOAD DATA LOCAL INPATH "../../data/files/tsformat2.json" INTO TABLE json_serde_tsformat2_1; + +-- JsonSerDe from serde lib +CREATE TABLE json_serde_tsformat2_2 (c1 int, c2 string, c3 timestamp) +ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.JsonSerDe' +WITH SERDEPROPERTIES ('timestamp.formats'='MM/dd/yyyy HH:mm:ss') +; +LOAD DATA LOCAL INPATH "../../data/files/tsformat2.json" INTO TABLE json_serde_tsformat2_2; +select a.c1, a.c2, a.c3, b.c3 +from json_serde_tsformat2_1 a join json_serde_tsformat2_2 b on a.c1 = b.c1; + +drop table json_serde_tsformat2_1; +drop table json_serde_tsformat2_2; diff --git a/ql/src/test/results/clientpositive/json_serde_tsformat2.q.out b/ql/src/test/results/clientpositive/json_serde_tsformat2.q.out new file mode 100644 index 0000000000..f2cca36cd9 --- /dev/null +++ b/ql/src/test/results/clientpositive/json_serde_tsformat2.q.out @@ -0,0 +1,70 @@ +PREHOOK: query: CREATE TABLE json_serde_tsformat2_1 (c1 int, c2 string, c3 timestamp) +ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' +WITH SERDEPROPERTIES ('timestamp.formats'='MM/dd/yyyy HH:mm:ss') +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@json_serde_tsformat2_1 +POSTHOOK: query: CREATE TABLE json_serde_tsformat2_1 (c1 int, c2 string, c3 timestamp) +ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' +WITH SERDEPROPERTIES ('timestamp.formats'='MM/dd/yyyy HH:mm:ss') +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@json_serde_tsformat2_1 +PREHOOK: query: LOAD DATA LOCAL INPATH "../../data/files/tsformat2.json" INTO TABLE json_serde_tsformat2_1 +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@json_serde_tsformat2_1 +POSTHOOK: query: LOAD DATA LOCAL INPATH "../../data/files/tsformat2.json" INTO TABLE json_serde_tsformat2_1 +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@json_serde_tsformat2_1 +PREHOOK: query: CREATE TABLE json_serde_tsformat2_2 (c1 int, c2 string, c3 timestamp) +ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.JsonSerDe' +WITH SERDEPROPERTIES ('timestamp.formats'='MM/dd/yyyy HH:mm:ss') +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@json_serde_tsformat2_2 +POSTHOOK: query: CREATE TABLE json_serde_tsformat2_2 (c1 int, c2 string, c3 timestamp) +ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.JsonSerDe' +WITH SERDEPROPERTIES ('timestamp.formats'='MM/dd/yyyy HH:mm:ss') +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@json_serde_tsformat2_2 +PREHOOK: query: LOAD DATA LOCAL INPATH "../../data/files/tsformat2.json" INTO TABLE json_serde_tsformat2_2 +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@json_serde_tsformat2_2 +POSTHOOK: query: LOAD DATA LOCAL INPATH "../../data/files/tsformat2.json" INTO TABLE json_serde_tsformat2_2 +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@json_serde_tsformat2_2 +PREHOOK: query: select a.c1, a.c2, a.c3, b.c3 +from json_serde_tsformat2_1 a join json_serde_tsformat2_2 b on a.c1 = b.c1 +PREHOOK: type: QUERY +PREHOOK: Input: default@json_serde_tsformat2_1 +PREHOOK: Input: default@json_serde_tsformat2_2 +#### A masked pattern was here #### +POSTHOOK: query: select a.c1, a.c2, a.c3, b.c3 +from json_serde_tsformat2_1 a join json_serde_tsformat2_2 b on a.c1 = b.c1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@json_serde_tsformat2_1 +POSTHOOK: Input: default@json_serde_tsformat2_2 +#### A masked pattern was here #### +123 abc 2001-02-03 12:34:56 2001-02-03 12:34:56 +456 xyz 1906-04-18 05:12:00 1906-04-18 05:12:00 +PREHOOK: query: drop table json_serde_tsformat2_1 +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@json_serde_tsformat2_1 +PREHOOK: Output: default@json_serde_tsformat2_1 +POSTHOOK: query: drop table json_serde_tsformat2_1 +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@json_serde_tsformat2_1 +POSTHOOK: Output: default@json_serde_tsformat2_1 +PREHOOK: query: drop table json_serde_tsformat2_2 +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@json_serde_tsformat2_2 +PREHOOK: Output: default@json_serde_tsformat2_2 +POSTHOOK: query: drop table json_serde_tsformat2_2 +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@json_serde_tsformat2_2 +POSTHOOK: Output: default@json_serde_tsformat2_2 diff --git a/serde/src/java/org/apache/hadoop/hive/serde2/json/HiveJsonStructReader.java b/serde/src/java/org/apache/hadoop/hive/serde2/json/HiveJsonStructReader.java index ec4efad43d..faab353bab 100644 --- a/serde/src/java/org/apache/hadoop/hive/serde2/json/HiveJsonStructReader.java +++ b/serde/src/java/org/apache/hadoop/hive/serde2/json/HiveJsonStructReader.java @@ -319,12 +319,18 @@ private Object parsePrimitive(JsonParser parser, PrimitiveObjectInspector oi) private Object getObjectOfCorrespondingPrimitiveType(String s, PrimitiveObjectInspector oi) throws IOException { - PrimitiveTypeInfo typeInfo = oi.getTypeInfo(); + Object value = parsePrimitiveValue(s, oi); if (writeablePrimitives) { - Converter c = ObjectInspectorConverters.getConverter(PrimitiveObjectInspectorFactory.javaStringObjectInspector, oi); - return c.convert(s); + Converter c = ObjectInspectorConverters.getConverter( + PrimitiveObjectInspectorFactory.getPrimitiveJavaObjectInspector(oi.getTypeInfo()), oi); + value = c.convert(value); } + return value; + } + + private Object parsePrimitiveValue(String s, PrimitiveObjectInspector oi) throws IOException { + PrimitiveTypeInfo typeInfo = oi.getTypeInfo(); switch (typeInfo.getPrimitiveCategory()) { case INT: return Integer.valueOf(s);