Search in sources :

Example 6 with Array

use of org.apache.avro.generic.GenericData.Array in project nifi by apache.

the class AvroTypeUtil method normalizeValue.

/**
 * Convert an Avro object to a normal Java objects for further processing.
 * The counter-part method which convert a raw value to an Avro object is {@link #convertToAvroObject(Object, Schema, String)}
 */
private static Object normalizeValue(final Object value, final Schema avroSchema, final String fieldName) {
    if (value == null) {
        return null;
    }
    switch(avroSchema.getType()) {
        case INT:
            {
                final LogicalType logicalType = avroSchema.getLogicalType();
                if (logicalType == null) {
                    return value;
                }
                final String logicalName = logicalType.getName();
                if (LOGICAL_TYPE_DATE.equals(logicalName)) {
                    // date logical name means that the value is number of days since Jan 1, 1970
                    return new java.sql.Date(TimeUnit.DAYS.toMillis((int) value));
                } else if (LOGICAL_TYPE_TIME_MILLIS.equals(logicalName)) {
                    // time-millis logical name means that the value is number of milliseconds since midnight.
                    return new java.sql.Time((int) value);
                }
                break;
            }
        case LONG:
            {
                final LogicalType logicalType = avroSchema.getLogicalType();
                if (logicalType == null) {
                    return value;
                }
                final String logicalName = logicalType.getName();
                if (LOGICAL_TYPE_TIME_MICROS.equals(logicalName)) {
                    return new java.sql.Time(TimeUnit.MICROSECONDS.toMillis((long) value));
                } else if (LOGICAL_TYPE_TIMESTAMP_MILLIS.equals(logicalName)) {
                    return new java.sql.Timestamp((long) value);
                } else if (LOGICAL_TYPE_TIMESTAMP_MICROS.equals(logicalName)) {
                    return new java.sql.Timestamp(TimeUnit.MICROSECONDS.toMillis((long) value));
                }
                break;
            }
        case UNION:
            if (value instanceof GenericData.Record) {
                final GenericData.Record avroRecord = (GenericData.Record) value;
                return normalizeValue(value, avroRecord.getSchema(), fieldName);
            }
            return convertUnionFieldValue(value, avroSchema, schema -> normalizeValue(value, schema, fieldName), fieldName);
        case RECORD:
            final GenericData.Record record = (GenericData.Record) value;
            final Schema recordSchema = record.getSchema();
            final List<Field> recordFields = recordSchema.getFields();
            final Map<String, Object> values = new HashMap<>(recordFields.size());
            for (final Field field : recordFields) {
                final Object avroFieldValue = record.get(field.name());
                final Object fieldValue = normalizeValue(avroFieldValue, field.schema(), fieldName + "/" + field.name());
                values.put(field.name(), fieldValue);
            }
            final RecordSchema childSchema = AvroTypeUtil.createSchema(recordSchema);
            return new MapRecord(childSchema, values);
        case BYTES:
            final ByteBuffer bb = (ByteBuffer) value;
            final LogicalType logicalType = avroSchema.getLogicalType();
            if (logicalType != null && LOGICAL_TYPE_DECIMAL.equals(logicalType.getName())) {
                return new Conversions.DecimalConversion().fromBytes(bb, avroSchema, logicalType);
            }
            return AvroTypeUtil.convertByteArray(bb.array());
        case FIXED:
            final GenericFixed fixed = (GenericFixed) value;
            return AvroTypeUtil.convertByteArray(fixed.bytes());
        case ENUM:
            return value.toString();
        case NULL:
            return null;
        case STRING:
            return value.toString();
        case ARRAY:
            final GenericData.Array<?> array = (GenericData.Array<?>) value;
            final Object[] valueArray = new Object[array.size()];
            for (int i = 0; i < array.size(); i++) {
                final Schema elementSchema = avroSchema.getElementType();
                valueArray[i] = normalizeValue(array.get(i), elementSchema, fieldName + "[" + i + "]");
            }
            return valueArray;
        case MAP:
            final Map<?, ?> avroMap = (Map<?, ?>) value;
            final Map<String, Object> map = new HashMap<>(avroMap.size());
            for (final Map.Entry<?, ?> entry : avroMap.entrySet()) {
                Object obj = entry.getValue();
                if (obj instanceof Utf8 || obj instanceof CharSequence) {
                    obj = obj.toString();
                }
                final String key = entry.getKey().toString();
                obj = normalizeValue(obj, avroSchema.getValueType(), fieldName + "[" + key + "]");
                map.put(key, obj);
            }
            return map;
    }
    return value;
}
Also used : GenericFixed(org.apache.avro.generic.GenericFixed) Time(java.sql.Time) HashMap(java.util.HashMap) RecordSchema(org.apache.nifi.serialization.record.RecordSchema) Schema(org.apache.avro.Schema) SimpleRecordSchema(org.apache.nifi.serialization.SimpleRecordSchema) LogicalType(org.apache.avro.LogicalType) Time(java.sql.Time) Timestamp(java.sql.Timestamp) Field(org.apache.avro.Schema.Field) RecordField(org.apache.nifi.serialization.record.RecordField) SpecificRecord(org.apache.avro.specific.SpecificRecord) Record(org.apache.nifi.serialization.record.Record) MapRecord(org.apache.nifi.serialization.record.MapRecord) GenericRecord(org.apache.avro.generic.GenericRecord) RecordSchema(org.apache.nifi.serialization.record.RecordSchema) SimpleRecordSchema(org.apache.nifi.serialization.SimpleRecordSchema) MapRecord(org.apache.nifi.serialization.record.MapRecord) Timestamp(java.sql.Timestamp) GenericData(org.apache.avro.generic.GenericData) ByteBuffer(java.nio.ByteBuffer) Array(org.apache.avro.generic.GenericData.Array) Conversions(org.apache.avro.Conversions) Utf8(org.apache.avro.util.Utf8) Map(java.util.Map) HashMap(java.util.HashMap)

Example 7 with Array

use of org.apache.avro.generic.GenericData.Array in project nifi by apache.

the class TestWriteAvroResult method assertMatch.

protected void assertMatch(final Record record, final GenericRecord avroRecord) {
    for (final String fieldName : record.getSchema().getFieldNames()) {
        Object avroValue = avroRecord.get(fieldName);
        final Object recordValue = record.getValue(fieldName);
        if (recordValue instanceof String) {
            assertNotNull(fieldName + " should not have been null", avroValue);
            avroValue = avroValue.toString();
        }
        if (recordValue instanceof Object[] && avroValue instanceof ByteBuffer) {
            final ByteBuffer bb = (ByteBuffer) avroValue;
            final Object[] objectArray = (Object[]) recordValue;
            assertEquals("For field " + fieldName + ", byte buffer remaining should have been " + objectArray.length + " but was " + bb.remaining(), objectArray.length, bb.remaining());
            for (int i = 0; i < objectArray.length; i++) {
                assertEquals(objectArray[i], bb.get());
            }
        } else if (recordValue instanceof Object[]) {
            assertTrue(fieldName + " should have been instanceof Array", avroValue instanceof Array);
            final Array<?> avroArray = (Array<?>) avroValue;
            final Object[] recordArray = (Object[]) recordValue;
            assertEquals(fieldName + " not equal", recordArray.length, avroArray.size());
            for (int i = 0; i < recordArray.length; i++) {
                assertEquals(fieldName + "[" + i + "] not equal", recordArray[i], avroArray.get(i));
            }
        } else if (recordValue instanceof byte[]) {
            final ByteBuffer bb = ByteBuffer.wrap((byte[]) recordValue);
            assertEquals(fieldName + " not equal", bb, avroValue);
        } else if (recordValue instanceof Map) {
            assertTrue(fieldName + " should have been instanceof Map", avroValue instanceof Map);
            final Map<?, ?> avroMap = (Map<?, ?>) avroValue;
            final Map<?, ?> recordMap = (Map<?, ?>) recordValue;
            assertEquals(fieldName + " not equal", recordMap.size(), avroMap.size());
            for (Object s : avroMap.keySet()) {
                assertMatch((Record) recordMap.get(s.toString()), (GenericRecord) avroMap.get(s));
            }
        } else if (recordValue instanceof Record) {
            assertMatch((Record) recordValue, (GenericRecord) avroValue);
        } else {
            assertEquals(fieldName + " not equal", recordValue, avroValue);
        }
    }
}
Also used : Array(org.apache.avro.generic.GenericData.Array) Record(org.apache.nifi.serialization.record.Record) MapRecord(org.apache.nifi.serialization.record.MapRecord) GenericRecord(org.apache.avro.generic.GenericRecord) GenericRecord(org.apache.avro.generic.GenericRecord) ByteBuffer(java.nio.ByteBuffer) HashMap(java.util.HashMap) Map(java.util.Map)

Example 8 with Array

use of org.apache.avro.generic.GenericData.Array in project ksql by confluentinc.

the class KsqlAvroSerializerTest method buildConnectMapEntries.

private static GenericArray<GenericRecord> buildConnectMapEntries(final Map<Utf8, Object> data, final org.apache.avro.Schema valueSchema) {
    final org.apache.avro.Schema entrySchema = AvroTestUtil.connectOptionalKeyMapEntrySchema("KsqlDataSourceSchema", valueSchema);
    final org.apache.avro.Schema arraySchema = AvroTestUtil.connectOptionalKeyMapSchema(entrySchema);
    final Array<GenericRecord> entries = new Array<>(data.size(), arraySchema);
    data.entrySet().stream().map(e -> new GenericRecordBuilder(entrySchema).set("key", e.getKey()).set("value", e.getValue()).build()).forEach(entries::add);
    return entries;
}
Also used : Array(org.apache.avro.generic.GenericData.Array) GenericArray(org.apache.avro.generic.GenericArray) OPTIONAL_INT64_SCHEMA(org.apache.kafka.connect.data.Schema.OPTIONAL_INT64_SCHEMA) DecimalUtil(io.confluent.ksql.util.DecimalUtil) CoreMatchers(org.hamcrest.CoreMatchers) SchemaRegistryClient(io.confluent.kafka.schemaregistry.client.SchemaRegistryClient) SerializationException(org.apache.kafka.common.errors.SerializationException) Matchers.not(org.hamcrest.Matchers.not) Array(org.apache.avro.generic.GenericData.Array) OPTIONAL_BYTES_SCHEMA(org.apache.kafka.connect.data.Schema.OPTIONAL_BYTES_SCHEMA) ByteBuffer(java.nio.ByteBuffer) Schema(org.apache.kafka.connect.data.Schema) ConnectProperties(io.confluent.ksql.serde.connect.ConnectProperties) FLOAT64_SCHEMA(org.apache.kafka.connect.data.Schema.FLOAT64_SCHEMA) BigDecimal(java.math.BigDecimal) KsqlConstants.getSRSubject(io.confluent.ksql.util.KsqlConstants.getSRSubject) Matchers.nullValue(org.hamcrest.Matchers.nullValue) Map(java.util.Map) FieldAssembler(org.apache.avro.SchemaBuilder.FieldAssembler) INT64_SCHEMA(org.apache.kafka.connect.data.Schema.INT64_SCHEMA) Assert.fail(org.junit.Assert.fail) DecimalConversion(org.apache.avro.Conversions.DecimalConversion) MockSchemaRegistryClient(io.confluent.kafka.schemaregistry.client.MockSchemaRegistryClient) Utf8(org.apache.avro.util.Utf8) ImmutableMap(com.google.common.collect.ImmutableMap) Matchers.allOf(org.hamcrest.Matchers.allOf) OPTIONAL_BOOLEAN_SCHEMA(org.apache.kafka.connect.data.Schema.OPTIONAL_BOOLEAN_SCHEMA) KsqlConfig(io.confluent.ksql.util.KsqlConfig) KafkaAvroDeserializer(io.confluent.kafka.serializers.KafkaAvroDeserializer) OPTIONAL_INT32_SCHEMA(org.apache.kafka.connect.data.Schema.OPTIONAL_INT32_SCHEMA) List(java.util.List) Matchers.equalTo(org.hamcrest.Matchers.equalTo) Time(org.apache.kafka.connect.data.Time) KsqlException(io.confluent.ksql.util.KsqlException) Optional(java.util.Optional) OPTIONAL_STRING_SCHEMA(org.apache.kafka.connect.data.Schema.OPTIONAL_STRING_SCHEMA) Matchers.is(org.hamcrest.Matchers.is) ConnectSchema(org.apache.kafka.connect.data.ConnectSchema) Matchers.containsString(org.hamcrest.Matchers.containsString) MockitoJUnitRunner(org.mockito.junit.MockitoJUnitRunner) ExceptionUtils(org.apache.commons.lang3.exception.ExceptionUtils) GenericRecordBuilder(org.apache.avro.generic.GenericRecordBuilder) Date(org.apache.kafka.connect.data.Date) AvroData(io.confluent.connect.avro.AvroData) GenericArray(org.apache.avro.generic.GenericArray) Assert.assertThrows(org.junit.Assert.assertThrows) RunWith(org.junit.runner.RunWith) Timestamp(org.apache.kafka.connect.data.Timestamp) STRING_SCHEMA(org.apache.kafka.connect.data.Schema.STRING_SCHEMA) AvroSchema(io.confluent.kafka.schemaregistry.avro.AvroSchema) GenericData(org.apache.avro.generic.GenericData) ImmutableList(com.google.common.collect.ImmutableList) LogicalTypes(org.apache.avro.LogicalTypes) MatcherAssert.assertThat(org.hamcrest.MatcherAssert.assertThat) Deserializer(org.apache.kafka.common.serialization.Deserializer) LinkedList(java.util.LinkedList) Type(org.apache.avro.Schema.Type) Before(org.junit.Before) ThrowableMessageMatcher.hasMessage(org.junit.internal.matchers.ThrowableMessageMatcher.hasMessage) GenericRecord(org.apache.avro.generic.GenericRecord) UTF_8(java.nio.charset.StandardCharsets.UTF_8) OPTIONAL_FLOAT64_SCHEMA(org.apache.kafka.connect.data.Schema.OPTIONAL_FLOAT64_SCHEMA) Test(org.junit.Test) AbstractKafkaSchemaSerDeConfig(io.confluent.kafka.serializers.AbstractKafkaSchemaSerDeConfig) Serializer(org.apache.kafka.common.serialization.Serializer) Struct(org.apache.kafka.connect.data.Struct) Matcher(org.hamcrest.Matcher) SchemaMetadata(io.confluent.kafka.schemaregistry.client.SchemaMetadata) SchemaBuilder(org.apache.kafka.connect.data.SchemaBuilder) Collections(java.util.Collections) GenericRecordBuilder(org.apache.avro.generic.GenericRecordBuilder) GenericRecord(org.apache.avro.generic.GenericRecord)

Aggregations

Array (org.apache.avro.generic.GenericData.Array)8 Map (java.util.Map)6 HashMap (java.util.HashMap)5 Utf8 (org.apache.avro.util.Utf8)5 GenericRecord (org.apache.avro.generic.GenericRecord)4 ByteBuffer (java.nio.ByteBuffer)3 Field (org.apache.avro.Schema.Field)3 FieldSpec (com.linkedin.pinot.common.data.FieldSpec)2 IOException (java.io.IOException)2 Schema (org.apache.avro.Schema)2 Type (org.apache.avro.Schema.Type)2 GenericArray (org.apache.avro.generic.GenericArray)2 GenericData (org.apache.avro.generic.GenericData)2 MapRecord (org.apache.nifi.serialization.record.MapRecord)2 Record (org.apache.nifi.serialization.record.Record)2 ImmutableList (com.google.common.collect.ImmutableList)1 ImmutableMap (com.google.common.collect.ImmutableMap)1 AvroData (io.confluent.connect.avro.AvroData)1 AvroSchema (io.confluent.kafka.schemaregistry.avro.AvroSchema)1 MockSchemaRegistryClient (io.confluent.kafka.schemaregistry.client.MockSchemaRegistryClient)1