diff --git a/ql/src/test/queries/clientnegative/opencsvserde_unsupported.q b/ql/src/test/queries/clientnegative/opencsvserde_unsupported.q new file mode 100644 index 0000000..98d5c7e --- /dev/null +++ b/ql/src/test/queries/clientnegative/opencsvserde_unsupported.q @@ -0,0 +1,4 @@ +CREATE EXTERNAL TABLE test (totalprice DECIMAL(38,10)) +ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' with +serdeproperties ("separatorChar" = ",","quoteChar"= "'","escapeChar"= "\\") +STORED AS TEXTFILE tblproperties ("skip.header.line.count"="1"); diff --git a/ql/src/test/results/clientnegative/opencsvserde_unsupported.q.out b/ql/src/test/results/clientnegative/opencsvserde_unsupported.q.out new file mode 100644 index 0000000..1f11d8a --- /dev/null +++ b/ql/src/test/results/clientnegative/opencsvserde_unsupported.q.out @@ -0,0 +1,8 @@ +PREHOOK: query: CREATE EXTERNAL TABLE test (totalprice DECIMAL(38,10)) +ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' with +serdeproperties ("separatorChar" = ",","quoteChar"= "'","escapeChar"= "\\") +STORED AS TEXTFILE tblproperties ("skip.header.line.count"="1") +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@test +FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. java.lang.RuntimeException: MetaException(message:org.apache.hadoop.hive.serde2.SerDeException Column type: decimal(38,10) not supported for OpenCSVSerde) diff --git a/serde/src/java/org/apache/hadoop/hive/serde2/OpenCSVSerde.java b/serde/src/java/org/apache/hadoop/hive/serde2/OpenCSVSerde.java index a7059c0..b647cd4 100644 --- a/serde/src/java/org/apache/hadoop/hive/serde2/OpenCSVSerde.java +++ b/serde/src/java/org/apache/hadoop/hive/serde2/OpenCSVSerde.java @@ -21,10 +21,14 @@ import org.apache.hadoop.hive.serde.serdeConstants; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory; +import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector.PrimitiveCategory; import org.apache.hadoop.hive.serde2.objectinspector.StructField; import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory; import org.apache.hadoop.hive.serde2.objectinspector.primitive.StringObjectInspector; +import org.apache.hadoop.hive.serde2.typeinfo.PrimitiveTypeInfo; +import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo; +import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoUtils; import org.apache.hadoop.io.Text; import org.apache.hadoop.io.Writable; import org.slf4j.Logger; @@ -73,12 +77,20 @@ public void initialize(final Configuration conf, final Properties tbl) throws Se final List columnNames = Arrays.asList(tbl.getProperty(serdeConstants.LIST_COLUMNS) .split(",")); + String columnTypeProperty = tbl.getProperty(serdeConstants.LIST_COLUMN_TYPES); + List columnTypes = TypeInfoUtils.getTypeInfosFromTypeString(columnTypeProperty); numCols = columnNames.size(); final List columnOIs = new ArrayList(numCols); for (int i = 0; i < numCols; i++) { + TypeInfo columnType = columnTypes.get(i); + if (columnType.getCategory() != ObjectInspector.Category.PRIMITIVE || + ((PrimitiveTypeInfo)columnType).getPrimitiveCategory() != PrimitiveCategory.STRING) { + throw new SerDeException("Column type: " + columnType + + " not supported for OpenCSVSerde"); + } columnOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector); }