You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@parquet.apache.org by bl...@apache.org on 2015/12/04 20:47:49 UTC
parquet-mr git commit: PARQUET-387: Improve NPE message when avro
arrays contain null.
Repository: parquet-mr
Updated Branches:
refs/heads/master e32aa6fe0 -> 14097c64d
PARQUET-387: Improve NPE message when avro arrays contain null.
Previously, the NPE had no error message but the Avro support accepts
schemas that have nullable array elements.
Author: Ryan Blue <bl...@apache.org>
Closes #291 from rdblue/PARQUET-387-fix-npe-message and squashes the following commits:
39d3c83 [Ryan Blue] PARQUET-387: Update test case to verify help message.
d6b6bd8 [Ryan Blue] PARQUET-387: Improve NPE message when avro arrays contain null.
Project: http://git-wip-us.apache.org/repos/asf/parquet-mr/repo
Commit: http://git-wip-us.apache.org/repos/asf/parquet-mr/commit/14097c64
Tree: http://git-wip-us.apache.org/repos/asf/parquet-mr/tree/14097c64
Diff: http://git-wip-us.apache.org/repos/asf/parquet-mr/diff/14097c64
Branch: refs/heads/master
Commit: 14097c64d243794610788d3ebb2e81ba8fd867c0
Parents: e32aa6f
Author: Ryan Blue <bl...@apache.org>
Authored: Fri Dec 4 11:47:38 2015 -0800
Committer: Ryan Blue <bl...@apache.org>
Committed: Fri Dec 4 11:47:38 2015 -0800
----------------------------------------------------------------------
.../apache/parquet/avro/AvroWriteSupport.java | 38 +++++++++++++++++---
.../avro/TestReadWriteOldListBehavior.java | 4 ++-
2 files changed, 37 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/parquet-mr/blob/14097c64/parquet-avro/src/main/java/org/apache/parquet/avro/AvroWriteSupport.java
----------------------------------------------------------------------
diff --git a/parquet-avro/src/main/java/org/apache/parquet/avro/AvroWriteSupport.java b/parquet-avro/src/main/java/org/apache/parquet/avro/AvroWriteSupport.java
index 35e3924..48fc01e 100644
--- a/parquet-avro/src/main/java/org/apache/parquet/avro/AvroWriteSupport.java
+++ b/parquet-avro/src/main/java/org/apache/parquet/avro/AvroWriteSupport.java
@@ -452,8 +452,24 @@ public class AvroWriteSupport<T> extends WriteSupport<T> {
Collection<?> array) {
if (array.size() > 0) {
recordConsumer.startField(OLD_LIST_REPEATED_NAME, 0);
- for (Object elt : array) {
- writeValue(schema.getType(0), avroSchema.getElementType(), elt);
+ try {
+ for (Object elt : array) {
+ writeValue(schema.getType(0), avroSchema.getElementType(), elt);
+ }
+ } catch (NullPointerException e) {
+ // find the null element and throw a better error message
+ int i = 0;
+ for (Object elt : array) {
+ if (elt == null) {
+ throw new NullPointerException(
+ "Array contains a null element at " + i + "\n" +
+ "Set parquet.avro.write-old-list-structure=false to turn " +
+ "on support for arrays with null elements.");
+ }
+ i += 1;
+ }
+ // no element was null, throw the original exception
+ throw e;
}
recordConsumer.endField(OLD_LIST_REPEATED_NAME, 0);
}
@@ -464,8 +480,22 @@ public class AvroWriteSupport<T> extends WriteSupport<T> {
Object[] array) {
if (array.length > 0) {
recordConsumer.startField(OLD_LIST_REPEATED_NAME, 0);
- for (Object element : array) {
- writeValue(type.getType(0), schema.getElementType(), element);
+ try {
+ for (Object element : array) {
+ writeValue(type.getType(0), schema.getElementType(), element);
+ }
+ } catch (NullPointerException e) {
+ // find the null element and throw a better error message
+ for (int i = 0; i < array.length; i += 1) {
+ if (array[i] == null) {
+ throw new NullPointerException(
+ "Array contains a null element at " + i + "\n" +
+ "Set parquet.avro.write-old-list-structure=false to turn " +
+ "on support for arrays with null elements.");
+ }
+ }
+ // no element was null, throw the original exception
+ throw e;
}
recordConsumer.endField(OLD_LIST_REPEATED_NAME, 0);
}
http://git-wip-us.apache.org/repos/asf/parquet-mr/blob/14097c64/parquet-avro/src/test/java/org/apache/parquet/avro/TestReadWriteOldListBehavior.java
----------------------------------------------------------------------
diff --git a/parquet-avro/src/test/java/org/apache/parquet/avro/TestReadWriteOldListBehavior.java b/parquet-avro/src/test/java/org/apache/parquet/avro/TestReadWriteOldListBehavior.java
index 7c2bc27..64caacc 100644
--- a/parquet-avro/src/test/java/org/apache/parquet/avro/TestReadWriteOldListBehavior.java
+++ b/parquet-avro/src/test/java/org/apache/parquet/avro/TestReadWriteOldListBehavior.java
@@ -43,6 +43,7 @@ import org.apache.parquet.hadoop.api.WriteSupport;
import org.apache.parquet.io.api.Binary;
import org.apache.parquet.io.api.RecordConsumer;
import org.apache.parquet.schema.MessageTypeParser;
+import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -347,7 +348,8 @@ public class TestReadWriteOldListBehavior {
writer.write(record);
fail("Should not succeed writing an array with null values");
} catch (Exception e) {
- // expected
+ Assert.assertTrue("Error message should provide context and help",
+ e.getMessage().contains("parquet.avro.write-old-list-structure"));
} finally {
writer.close();
}