Latest Avro compiler (1.8.2) generates java sources for dates logical types with Joda-Time based implementations. How can I configure Avro compiler to produce sources that used Java 8 date-time API?
Latest Avro compiler (1.8.2) generates java sources for dates logical types with Joda-Time based implementations. How can I configure Avro compiler to produce sources that used Java 8 date-time API?
Currently (avro 1.8.2) this is not possible. It's hardcoded to generate Joda date/time classes.
The current master branch has switched to Java 8 and there is an open issue (with Pull Request) to add the ability to generate classes with java.time.* types.
I have no idea on any kind of release schedule for whatever is currently in master unfortunately. If you feel adventurous you can apply the patch to 1.8.2, since in theory it should all be compatible. The underlying base types when serializing / deserializing are still integers and longs.
1.9.0 < 1.10.0<dateTimeLogicalTypeImplementation>jsr310</dateTimeLogicalTypeImplementation>
into configuration section.1.10.0With avro 1.9.2 you can use e.g. date for LocalDate:
{
"name": "Transaction",
"type": "record",
"fields": [
{
"name": "time",
"type": {
"type": "int",
"logicalType": "date"
}
},
See Logical Types for the other types.
Avro v1.11.0 TimeConversions has built-in support for Java 8 time classes such as LocalDate, Instant, etc. The TimeConversions must be registered with the SpecificData class or its sub-classes, such as ReflectData. Here is a complete example of how to use TimeConversions:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Account
{
private int id;
private LocalDate createdOn;
public static void main(String[] args) throws IOException
{
// create schema from POJO Account class
ReflectData reflectData = ReflectData.get();
reflectData.addLogicalTypeConversion(new TimeConversions.DateConversion());
Schema schema = reflectData.getSchema(Account.class);
System.out.println("Schema in JSON:\n" + schema + "\n");
// create avro writer
DatumWriter<Account> datumWriter = new ReflectDatumWriter<>(schema);
DataFileWriter<Account> dataFileWriter = new DataFileWriter<>(datumWriter);
// dataFileWriter.setCodec(CodecFactory.snappyCodec()); // for compression
dataFileWriter.create(schema, new File("accounts.avro"));
dataFileWriter.append(new Account(123, LocalDate.of(2001, 1, 1)));
dataFileWriter.append(new Account(234, LocalDate.of(2002, 2, 2)));
dataFileWriter.close();
// create avro reader
DatumReader<Account> datumReader = new ReflectDatumReader<>(schema);
DataFileReader<Account> dataFileReader = new DataFileReader<>(new File("accounts.avro"), datumReader);
dataFileReader.forEach(System.out::println);
}
}