Github user manishgupta88 commented on a diff in the pull request:
https://github.com/apache/carbondata/pull/2671#discussion_r214244301
--- Diff: store/sdk/src/main/java/org/apache/carbondata/sdk/file/AvroCarbonWriter.java ---
@@ -213,6 +181,124 @@ private Object avroFieldToObject(Schema.Field avroField, Object fieldValue) {
}
out = new ArrayObject(arrayChildObjects);
break;
+ case UNION:
+ // Union type will be internally stored as Struct<col:type>
+ // Fill data object only if fieldvalue is instance of datatype
+ // For other field datatypes, fill value as Null
+ List<Schema> unionFields = avroField.schema().getTypes();
+ int notNullUnionFieldsCount = 0;
+ for (Schema unionField : unionFields) {
+ if (!unionField.getType().equals(Schema.Type.NULL)) {
+ notNullUnionFieldsCount++;
+ }
+ }
+ Object[] values = new Object[notNullUnionFieldsCount];
+ int j = 0;
+ for (Schema unionField : unionFields) {
+ if (!unionField.getType().equals(Schema.Type.NULL) && checkFieldValueType(
+ unionField.getType(), fieldValue)) {
+ values[j] = avroFieldToObjectForUnionType(unionField, fieldValue, avroField);
+ break;
+ }
+ if (notNullUnionFieldsCount != 1) {
+ j++;
+ }
+ }
--- End diff --
Modify the code as below
int j = 0;
for (Schema unionField : unionFields) {
if (unionField.getType().equals(Schema.Type.NULL) ) {
continue;
}
if (checkFieldValueType(unionField.getType(), fieldValue)) {
values[j] = avroFieldToObjectForUnionType(unionField, fieldValue, avroField);
break;
}
j++;
}
---