diff --git a/.classpath b/.classpath index d6a3d16..4ae4e1d 100644 --- a/.classpath +++ b/.classpath @@ -6,5 +6,8 @@ + + + diff --git a/ivy.xml b/ivy.xml index f252abb..87c7aeb 100644 --- a/ivy.xml +++ b/ivy.xml @@ -34,6 +34,7 @@ + diff --git a/src/main/java/com/bizo/hive/serde/csv/CSVSerde.java b/src/main/java/com/bizo/hive/serde/csv/CSVSerde.java index 2be9260..3ed1516 100644 --- a/src/main/java/com/bizo/hive/serde/csv/CSVSerde.java +++ b/src/main/java/com/bizo/hive/serde/csv/CSVSerde.java @@ -35,9 +35,9 @@ import au.com.bytecode.opencsv.CSVWriter; public final class CSVSerde implements SerDe { private ObjectInspector inspector; - String[] outputFields; - int numCols; - List row; + private String[] outputFields; + private int numCols; + private List row; @Override public void initialize(final Configuration conf, final Properties tbl) throws SerDeException { @@ -102,8 +102,9 @@ public final class CSVSerde implements SerDe { public Object deserialize(final Writable blob) throws SerDeException { Text rowText = (Text) blob; + CSVReader csv = null; try { - final CSVReader csv = new CSVReader(new CharArrayReader(rowText.toString().toCharArray())); + csv = new CSVReader(new CharArrayReader(rowText.toString().toCharArray())); final String[] read = csv.readNext(); for (int i=0; i< numCols; i++) { @@ -117,6 +118,14 @@ public final class CSVSerde implements SerDe { return row; } catch (final Exception e) { throw new SerDeException(e); + } finally { + if (csv != null) { + try { + csv.close(); + } catch (final Exception e) { + // ignore + } + } } } diff --git a/src/test/java/com/bizo/hive/serde/csv/CSVSerdeTest.java b/src/test/java/com/bizo/hive/serde/csv/CSVSerdeTest.java new file mode 100644 index 0000000..e7bc53a --- /dev/null +++ b/src/test/java/com/bizo/hive/serde/csv/CSVSerdeTest.java @@ -0,0 +1,35 @@ +package com.bizo.hive.serde.csv; + +import java.util.List; +import java.util.Properties; + +import org.apache.hadoop.hive.serde.Constants; +import org.apache.hadoop.io.Text; +import org.junit.Before; +import org.junit.Test; +import static org.junit.Assert.assertEquals; + + +public final class CSVSerdeTest { + private final CSVSerde csv = new CSVSerde(); + + @Before + public void setup() throws Exception { + final Properties props = new Properties(); + props.put(Constants.LIST_COLUMNS, "a,b,c"); + props.put(Constants.LIST_COLUMN_TYPES, "string,string,string"); + + csv.initialize(null, props); + } + + @Test + public void testDeserialize() throws Exception { + final Text in = new Text("hello,\"yes, okay\",1"); + + final List row = (List) csv.deserialize(in); + + assertEquals("hello", row.get(0)); + assertEquals("yes, okay", row.get(1)); + assertEquals("1", row.get(2)); + } +}