diff --git a/hbase-handler/src/java/org/apache/hadoop/hive/hbase/HBaseLazyObjectFactory.java b/hbase-handler/src/java/org/apache/hadoop/hive/hbase/HBaseLazyObjectFactory.java index 841e8ba229..999b71765b 100644 --- a/hbase-handler/src/java/org/apache/hadoop/hive/hbase/HBaseLazyObjectFactory.java +++ b/hbase-handler/src/java/org/apache/hadoop/hive/hbase/HBaseLazyObjectFactory.java @@ -18,22 +18,20 @@ package org.apache.hadoop.hive.hbase; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Properties; - +import org.apache.commons.lang3.StringUtils; import org.apache.hadoop.hive.hbase.struct.HBaseValueFactory; import org.apache.hadoop.hive.serde2.SerDeException; import org.apache.hadoop.hive.serde2.lazy.LazySerDeParameters; import org.apache.hadoop.hive.serde2.lazy.objectinspector.LazyObjectInspectorFactory; -import org.apache.hadoop.hive.serde2.lazy.objectinspector.primitive.LazyObjectInspectorParameters; -import org.apache.hadoop.hive.serde2.lazy.objectinspector.primitive.LazyObjectInspectorParametersImpl; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory.ObjectInspectorOptions; import org.apache.hadoop.hive.serde2.typeinfo.TypeInfo; -import org.apache.hadoop.io.Text; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Properties; // Does same thing with LazyFactory#createLazyObjectInspector except that this replaces // original keyOI with OI which is create by HBaseKeyFactory provided by serde property for hbase @@ -72,8 +70,8 @@ public static ObjectInspector createLazyHBaseStructInspector(HBaseSerDeParameter .createValueObjectInspector(columnTypes.get(i))); } } - List structFieldComments = tbl.getProperty("columns.comments") == null ? - new ArrayList(Collections.nCopies(columnTypes.size(), "")) + List structFieldComments = StringUtils.isEmpty(tbl.getProperty("columns.comments")) ? + new ArrayList<>(Collections.nCopies(columnTypes.size(), "")) : Arrays.asList(tbl.getProperty("columns.comments").split("\0", columnTypes.size())); return LazyObjectInspectorFactory.getLazySimpleStructObjectInspector( diff --git a/hbase-handler/src/test/org/apache/hadoop/hive/hbase/TestHBaseSerDe.java b/hbase-handler/src/test/org/apache/hadoop/hive/hbase/TestHBaseSerDe.java index 14557d3bac..031c0a8e14 100644 --- a/hbase-handler/src/test/org/apache/hadoop/hive/hbase/TestHBaseSerDe.java +++ b/hbase-handler/src/test/org/apache/hadoop/hive/hbase/TestHBaseSerDe.java @@ -29,7 +29,6 @@ import junit.framework.Assert; import junit.framework.TestCase; - import org.apache.avro.Schema; import org.apache.avro.file.DataFileWriter; import org.apache.avro.generic.GenericData; @@ -43,7 +42,6 @@ import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hbase.Cell; -import org.apache.hadoop.hbase.CellComparator; import org.apache.hadoop.hbase.KeyValue; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Result; @@ -63,8 +61,8 @@ import org.apache.hadoop.hive.serde2.io.DoubleWritable; import org.apache.hadoop.hive.serde2.io.ShortWritable; import org.apache.hadoop.hive.serde2.lazy.LazyPrimitive; -import org.apache.hadoop.hive.serde2.lazy.LazyStruct; import org.apache.hadoop.hive.serde2.lazy.LazySerDeParameters; +import org.apache.hadoop.hive.serde2.lazy.LazyStruct; import org.apache.hadoop.hive.serde2.objectinspector.StructField; import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector; import org.apache.hadoop.io.BooleanWritable; @@ -1455,6 +1453,18 @@ public void testHBaseSerDeCustomStructValue() throws IOException, SerDeException } + /** + * Since there are assertions in the code, when running this test it throws an assertion error + * and not the error in a production setup. The Properties.java object that is passed to the serDe + * initializer, is passed with empty value "" for "columns.comments" key for hbase backed tables. + */ + public void testEmptyColumnComment() throws SerDeException { + HBaseSerDe serDe = new HBaseSerDe(); + Properties tbl = createPropertiesForValueStruct(); + tbl.setProperty("columns.comments", ""); + serDe.initialize(new Configuration(), tbl); + } + private Properties createPropertiesForValueStruct() { Properties tbl = new Properties(); tbl.setProperty("cola.struct.serialization.type", "struct");