diff --git ql/src/java/org/apache/hadoop/hive/ql/io/parquet/serde/ArrayWritableObjectInspector.java ql/src/java/org/apache/hadoop/hive/ql/io/parquet/serde/ArrayWritableObjectInspector.java index 6091882..783c77f 100644 --- ql/src/java/org/apache/hadoop/hive/ql/io/parquet/serde/ArrayWritableObjectInspector.java +++ ql/src/java/org/apache/hadoop/hive/ql/io/parquet/serde/ArrayWritableObjectInspector.java @@ -154,7 +154,12 @@ public Object getStructFieldData(final Object data, final StructField fieldRef) @Override public StructField getStructFieldRef(final String name) { - return fieldsByName.get(name); + for(final StructField field: fields) { + if (field.getFieldName().equalsIgnoreCase(name)) { + return field; + } + } + return null; } @Override diff --git ql/src/test/queries/clientpositive/parquet_mixed_case_nested.q ql/src/test/queries/clientpositive/parquet_mixed_case_nested.q new file mode 100644 index 0000000..6907244 --- /dev/null +++ ql/src/test/queries/clientpositive/parquet_mixed_case_nested.q @@ -0,0 +1,30 @@ +DROP TABLE parquet_mixed_case_nested_staging; +DROP TABLE parquet_mixed_case_nested; + +CREATE TABLE parquet_mixed_case_nested_staging ( + id int, + str string, + mp MAP, + lst ARRAY, + strct STRUCT +) ROW FORMAT DELIMITED +FIELDS TERMINATED BY '|' +COLLECTION ITEMS TERMINATED BY ',' +MAP KEYS TERMINATED BY ':'; + +LOAD DATA LOCAL INPATH '../../data/files/parquet_create.txt' OVERWRITE INTO TABLE parquet_mixed_case_nested_staging; + +CREATE TABLE parquet_mixed_case_nested ( + strct STRUCT +) STORED AS PARQUET; + + +INSERT OVERWRITE TABLE parquet_mixed_case_nested SELECT strct FROM parquet_mixed_case_nested_staging; + +-- Query with the same casing as in the metadata +SELECT strct.lowercase, strct.MixedCase FROM parquet_mixed_case_nested; +-- Query with a different casing then in the metadata +SELECT strct.lowerCase, strct.mixedcase FROM parquet_mixed_case_nested; + +DROP TABLE parquet_mixed_case_nested_staging; +DROP TABLE parquet_mixed_case_nested; diff --git ql/src/test/results/clientpositive/parquet_mixed_case_nested.q.out ql/src/test/results/clientpositive/parquet_mixed_case_nested.q.out new file mode 100644 index 0000000..7d77be8 --- /dev/null +++ ql/src/test/results/clientpositive/parquet_mixed_case_nested.q.out @@ -0,0 +1,105 @@ +PREHOOK: query: DROP TABLE parquet_mixed_case_nested_staging +PREHOOK: type: DROPTABLE +POSTHOOK: query: DROP TABLE parquet_mixed_case_nested_staging +POSTHOOK: type: DROPTABLE +PREHOOK: query: DROP TABLE parquet_mixed_case_nested +PREHOOK: type: DROPTABLE +POSTHOOK: query: DROP TABLE parquet_mixed_case_nested +POSTHOOK: type: DROPTABLE +PREHOOK: query: CREATE TABLE parquet_mixed_case_nested_staging ( + id int, + str string, + mp MAP, + lst ARRAY, + strct STRUCT +) ROW FORMAT DELIMITED +FIELDS TERMINATED BY '|' +COLLECTION ITEMS TERMINATED BY ',' +MAP KEYS TERMINATED BY ':' +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@parquet_mixed_case_nested_staging +POSTHOOK: query: CREATE TABLE parquet_mixed_case_nested_staging ( + id int, + str string, + mp MAP, + lst ARRAY, + strct STRUCT +) ROW FORMAT DELIMITED +FIELDS TERMINATED BY '|' +COLLECTION ITEMS TERMINATED BY ',' +MAP KEYS TERMINATED BY ':' +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@parquet_mixed_case_nested_staging +PREHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/parquet_create.txt' OVERWRITE INTO TABLE parquet_mixed_case_nested_staging +PREHOOK: type: LOAD +#### A masked pattern was here #### +PREHOOK: Output: default@parquet_mixed_case_nested_staging +POSTHOOK: query: LOAD DATA LOCAL INPATH '../../data/files/parquet_create.txt' OVERWRITE INTO TABLE parquet_mixed_case_nested_staging +POSTHOOK: type: LOAD +#### A masked pattern was here #### +POSTHOOK: Output: default@parquet_mixed_case_nested_staging +PREHOOK: query: CREATE TABLE parquet_mixed_case_nested ( + strct STRUCT +) STORED AS PARQUET +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@parquet_mixed_case_nested +POSTHOOK: query: CREATE TABLE parquet_mixed_case_nested ( + strct STRUCT +) STORED AS PARQUET +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@parquet_mixed_case_nested +PREHOOK: query: INSERT OVERWRITE TABLE parquet_mixed_case_nested SELECT strct FROM parquet_mixed_case_nested_staging +PREHOOK: type: QUERY +PREHOOK: Input: default@parquet_mixed_case_nested_staging +PREHOOK: Output: default@parquet_mixed_case_nested +POSTHOOK: query: INSERT OVERWRITE TABLE parquet_mixed_case_nested SELECT strct FROM parquet_mixed_case_nested_staging +POSTHOOK: type: QUERY +POSTHOOK: Input: default@parquet_mixed_case_nested_staging +POSTHOOK: Output: default@parquet_mixed_case_nested +POSTHOOK: Lineage: parquet_mixed_case_nested.strct SIMPLE [(parquet_mixed_case_nested_staging)parquet_mixed_case_nested_staging.FieldSchema(name:strct, type:struct, comment:null), ] +PREHOOK: query: -- Query with the same casing as in the metadata +SELECT strct.lowercase, strct.MixedCase FROM parquet_mixed_case_nested +PREHOOK: type: QUERY +PREHOOK: Input: default@parquet_mixed_case_nested +#### A masked pattern was here #### +POSTHOOK: query: -- Query with the same casing as in the metadata +SELECT strct.lowercase, strct.MixedCase FROM parquet_mixed_case_nested +POSTHOOK: type: QUERY +POSTHOOK: Input: default@parquet_mixed_case_nested +#### A masked pattern was here #### +one two +three four +five six +PREHOOK: query: -- Query with a different casing then in the metadata +SELECT strct.lowerCase, strct.mixedcase FROM parquet_mixed_case_nested +PREHOOK: type: QUERY +PREHOOK: Input: default@parquet_mixed_case_nested +#### A masked pattern was here #### +POSTHOOK: query: -- Query with a different casing then in the metadata +SELECT strct.lowerCase, strct.mixedcase FROM parquet_mixed_case_nested +POSTHOOK: type: QUERY +POSTHOOK: Input: default@parquet_mixed_case_nested +#### A masked pattern was here #### +one two +three four +five six +PREHOOK: query: DROP TABLE parquet_mixed_case_nested_staging +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@parquet_mixed_case_nested_staging +PREHOOK: Output: default@parquet_mixed_case_nested_staging +POSTHOOK: query: DROP TABLE parquet_mixed_case_nested_staging +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@parquet_mixed_case_nested_staging +POSTHOOK: Output: default@parquet_mixed_case_nested_staging +PREHOOK: query: DROP TABLE parquet_mixed_case_nested +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@parquet_mixed_case_nested +PREHOOK: Output: default@parquet_mixed_case_nested +POSTHOOK: query: DROP TABLE parquet_mixed_case_nested +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@parquet_mixed_case_nested +POSTHOOK: Output: default@parquet_mixed_case_nested