Search code examples
javatimeavro

Avro Java API Timestamp Logical Type?


With the Avro Java API, I can make a simple record schema like:

    Schema schemaWithTimestamp = SchemaBuilder
            .record("MyRecord").namespace("org.demo")
            .fields()
            .name("timestamp").type().longType().noDefault()
            .endRecord();

How do I tag a schema field with a logical type, specifically: https://avro.apache.org/docs/1.8.1/api/java/org/apache/avro/LogicalTypes.TimestampMillis.html


Solution

  • Thanks to DontPanic:

        Schema timestampMilliType = LogicalTypes.timestampMillis().addToSchema(Schema.create(Schema.Type.LONG));
    
        Schema schemaWithTimestamp = SchemaBuilder
                .record("MyRecord").namespace("org.demo")
                .fields()
                .name("timestamp_with_logical_type").type(timestampMilliType).noDefault()
                .name("timestamp_no_logical_type").type().longType().noDefault()
                .endRecord();
    
        System.out.println(schemaWithTimestamp.toString(true));
    

    This results in:

    {
      "type" : "record",
      "name" : "MyRecord",
      "namespace" : "org.demo",
      "fields" : [ {
        "name" : "timestamp_with_logical_type",
        "type" : {
          "type" : "long",
          "logicalType" : "timestamp-millis"
        }
      }, {
        "name" : "timestamp_no_logical_type",
        "type" : "long"
      } ]
    }